小编Jer*_*ers的帖子

为什么WINWORD.EXE在从Delphi关闭文档后退出?

我设法提炼了我的问题中的根本问题之一如何跟踪下面单元中的OLE自动化对象的_AddRef/_Release调用.

我也会回答这个问题,以防其他人碰到这个问题.

问题:使用下面的代码,为什么WINWORD.EXE不会一直退出(有时它会退出).

该装置可能会被削减甚至更多.

unit Unit2;

interface

uses
  Winapi.Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
  Forms, Dialogs, StdCtrls,
  WordXP;

type
  TForm2 = class(TForm)
    WordXPFailsToQuitButton: TButton;
    procedure WordXPFailsToQuitButtonClick(Sender: TObject);
  private
    FWordApplication: TWordApplication;
  strict protected
    function GetWordApplication: TWordApplication; virtual;
    function GetWordApplication_Documents: Documents; virtual;
    procedure WordApplication_DocumentBeforeClose(ASender: TObject; const Doc: _Document; var Cancel: WordBool); virtual;
    procedure WordApplication_Quit(Sender: TObject); virtual;
    property WordApplication: TWordApplication read GetWordApplication;
    property WordApplication_Documents: Documents read GetWordApplication_Documents;
  end;

var
  Form2: TForm2;

implementation

uses
  Vcl.OleServer;

{$R *.dfm}

function TForm2.GetWordApplication: …
Run Code Online (Sandbox Code Playgroud)

delphi ole delphi-xe2

10
推荐指数
1
解决办法
1485
查看次数

是否有任何部分XSD描述Delphi TClientDataSet XML文件的METADATA部分?

我知道您无法完全描述具有XSD架构的TClientDataSet的XML,因为ROW元素具有名称随内容而变化的属性.

但是,这种XML的METADATA部分应该是.

所以:有具有(部分)的XSD描述了可以用Delphi TClientDataSets被保存在XML的元数据部分的人?

问候.

PS:

感谢指向XML-> XSD转换工具/站点; 我本来应该写的,我自己也这样做了,但是以适当的方式生成XSD(即涵盖所有可能性的那个)将需要输入XML,涵盖所有可能性(如往返,rowstate等).我会尝试以这种方式提出一个像样的XSD并在此发布.

xml delphi xsd tclientdataset

9
推荐指数
2
解决办法
2375
查看次数

Delphi - BPL中的unmangle名称

是否有可能在Delphi中取消这些名称?如果是这样,我在哪里可以获得更多信息?

它无法在dbrtl100.bpl中找到某个条目的错误消息示例我想知道它找不到哪个确切的函数(单位,类,名称,参数等).

---------------------------
myApp.exe - Entry Point Not Found
---------------------------
The procedure entry point @Dbcommon@GetTableNameFromSQLEx$qqrx17System@WideString25Dbcommon@IDENTIFIEROption could not be located in the dynamic link library dbrtl100.bpl. 
---------------------------
OK   
---------------------------
Run Code Online (Sandbox Code Playgroud)

我知道它是Dbcommon单元中的GetTableNameFromSQLEx方法(我有Delphi和RTL/VCL源代码),但有时我会遇到并非所有代码都可用的应用程序(是的,客户应该总是购买第三方的所有源代码)东西,但有时他们没有).

但是说这是一个我没有代码的例子,或只有接口文件(BDE.INT任何人?)它有什么参数(即哪个潜在的重载)?它有什么回报类型?

对于任何Delphi版本,这种破坏是否相同?

--jeroen

编辑1:

感谢Rob Kennedy:tdump -e dbrtl100.bpl可以解决问题.根本不需要-um:

C:\WINDOWS\system32>tdump -e dbrtl100.bpl | grep GetTableNameFromSQLEx
File STDIN:
00026050 1385 04AC __fastcall Dbcommon::GetTableNameFromSQLEx(const System::WideString, Dbcommon::IDENTIFIEROption)
Run Code Online (Sandbox Code Playgroud)

编辑2:

感谢TOndrej发现了这篇德语EDN文章(英文谷歌翻译).那篇文章非常准确地描述了格式,应该可以创建一些Delphi代码来解决这个问题.

Pitty,作者提到的网站(和电子邮件)现在已经死了,但很高兴知道这些信息.

--jeroen

delphi bpl name-mangling

9
推荐指数
3
解决办法
1955
查看次数

Delphi单元初始化并不总是被调用

我在.bpl中有一个单元,我需要一个我写的新函数的字符串列表.我希望stringlist在应用程序的生命周期内保持不变,这样每个调用都可以建立在之前调用的内容之上.

所以它在单元内全局声明,我在Initialization部分初始化它,如下所示:

var
  ProductLookup : TStrings;  
...

function foo : boolean;
begin
  result := (ProductLookup.IndexOfName('bar') >=0); //blow up here. It's nil. Why?
end;
....

initialization
  ProductLookup := TStringList.Create;  // This should get run, but doesn't.

finalization
  FreeAndNil(ProductLookup);

end.
Run Code Online (Sandbox Code Playgroud)

当我对它进行单元测试时,一切都很好.但是当它从主应用程序运行时,由于字符串列表为零而导致访问冲突.所以现在我在foo函数中检查nil并在必要时创建.但我不知道为什么初始化对我不起作用.我在初始化中放了一个调试消息,当它作为BPL加载时它不会运行,但如果我直接编译到我的dUnit exe中,它会运行.有任何想法吗?Delphi2005.

delphi initialization delphi-2005

9
推荐指数
1
解决办法
7762
查看次数

Visual Studio 2010:如何强制ASP.NET网站使用x86而不是"Any CPU"?

从非ASP.NET应用程序使用SharePoint DLL(仅限x86)时,可以将"平台目标"设置为x86(而不是"任何CPU"),以便Visual Studio 2010和应用程序加载SharePoint程序集.

但是,在x64开发系统上开发ASP.NET应用程序时,在构建Web站点时会收到这个可怕的错误消息:

无法加载文件或程序集"Microsoft.SharePoint.Search"或其依赖项之一.尝试加载格式不正确的程序.

这是因为在Visual Studio 2010中构建时,默认情况下ASP.NET是"任何CPU".

我怎么能改变呢?

我尝试了网站的属性页面,web.config,但无济于事.

注意:这是针对开发系统的.我知道对于服务器系统,我可以通过在"应用程序池默认值"中将"启用32位应用程序"设置为"True"来更改应用程序池以强制加载32位x86.

asp.net visual-studio-2010 .net-3.5 sharepoint-2010

8
推荐指数
1
解决办法
1万
查看次数

访问Delphi SOAP服务器中的原始TWebRequest对象

简介:如何在Delphi Soap Server应用程序中访问原始的TWebRequest对象?

我的Web服务ITest使用以下方法发布服务CallMe:

ITest = interface(IInvokable)
['{AA226176-FFAD-488F-8768-99E706450F31}']
  function CallMe: string; stdcall;
end;
...
initialization
InvRegistry.RegisterInterface(TypeInfo(ITest));
Run Code Online (Sandbox Code Playgroud)

该接口在类中实现:

TTest = class(TInvokableClass, ITest)
public
  function CallMe: string; stdcall;
end;
...
initialization
InvRegistry.RegisterInvokableClass(TTest, TestFactory);
Run Code Online (Sandbox Code Playgroud)

如何访问TWebRequest此方法实现中的原始对象?例如,如果我想检查设置了哪些cookie,或者在请求中读取其他属性:

function TTest.CallMe: string;
begin
  // how to access TWebRequest object
  ...
end;
Run Code Online (Sandbox Code Playgroud)

delphi soap web-services httpwebrequest

8
推荐指数
1
解决办法
1168
查看次数

未破坏未使用的接口引用

由于不小心使用Delphi接口,我的应用程序中有另一个错误.当我将接口传递给忽略该参数的过程时,实例永远不会被释放.请参阅以下简单示例:

ITest = interface
    procedure Test;
end;

Tester = class(TInterfacedObject, ITest)
public
    procedure Test;
end;

Base = class
public
    procedure UseTestOrNot(test : ITest); virtual; abstract;
end;

A = class(Base)
public
    procedure UseTestOrNot(test : ITest); override;
end;

B = class(Base)
public
    procedure UseTestOrNot(test : ITest); override;
end;

{ A }

procedure A.UseTestOrNot(test: ITest);
begin
    test.Test();
end;

{ B }

procedure B.UseTestOrNot(test: ITest);
begin
    WriteLn('No test here');
end;

// -------- Test ---------------------------------------
var
    list : TObjectList<Base>;
    x : Base;
    t : ITest; …
Run Code Online (Sandbox Code Playgroud)

delphi interface delphi-2010

7
推荐指数
2
解决办法
459
查看次数

是否有任何Delphi版本可以发出包含tkUnknown的RTTI?

只是为了确保我没有忽略一个奇怪的边缘情况,因为我发现了一个产生它的情况,但我想确保:

是否有任何Delphi版本可以发出包含类型tkUnknownTTypeKind的 RTTI ?

如果是这样:

  • 任何文件参考?
  • 什么类型会产生它?

在当前的Delphi XE5 RTL,我能找到处理的唯一地方tkUnknownTValue,但我还没有发现在RTL,设置了一个代码路径TValue包含所属类别tkUnknown作为.

delphi rtti

7
推荐指数
1
解决办法
307
查看次数

Delphi XE中没有更多xercesxmldom单元?

我想知道该xercesxmldom单元作为XML DOM实现之一发生了什么.
它似乎在Delphi XE中消失了.
为什么?

(我搜索了文档;找不到关于xercesxmldom消失的任何相关信息).

编辑:这些是我存档的来源:

R:\>dir /s /b xercesxmldom.pas
R:\D2006-Enterprise-D10-BDS-4.0\source\Win32\xml\xercesxmldom.pas
R:\D2007-Enterprise-D11-RadStudio-5.0\source\Win32\xml\xercesxmldom.pas
R:\D2009-Enterprise-D12-RadStudio-6.0\source\Win32\xml\xercesxmldom.pas
R:\D2010-Enterprise-D14-RadStudio-7.0\source\Win32\xml\xercesxmldom.pas
R:\D7.01.Architect\Source\Xml\xercesxmldom.pas
Run Code Online (Sandbox Code Playgroud)

R:\DXE-Enterprise-D15-RadStudio-8.0源树中没有任何内容......

--jeroen

delphi xerces xmldom delphi-xe

6
推荐指数
1
解决办法
1609
查看次数

C#将任何方法作为参数传递

记录时,总是会纠缠于字符串文字中.

我解决了很好的性能,通过传递一个字段和变量Expression<Func<T>> expression(如解释在这里),所以你可以做这样的事情:

public void Demo(string someArgument)
{
    LogFrameWork.LogLine("Demo"); // goal is to get rid of these string literals
    LogFramework.Log(() => someArgument);
}
Run Code Online (Sandbox Code Playgroud)

我想为方法Demo本身做类似的事情:

public void Demo(string someArgument)
{
    LogFramework.Log(this.Demo);
}
Run Code Online (Sandbox Code Playgroud)

我尝试过这样的事情:

public static void Log(Delegate method)
{
    string methodName = method.Method.Name;
    LogLine(methodName);
}
Run Code Online (Sandbox Code Playgroud)

还有这个:

public static void Log(Action method)
{
    string methodName = method.Method.Name;
    LogLine(methodName);
}
Run Code Online (Sandbox Code Playgroud)

但我得到这样的编译器错误:

Argument 1: cannot convert from 'method group' to 'System.Delegate' 
Argument 1: cannot convert from 'method group' …
Run Code Online (Sandbox Code Playgroud)

c# parameters methods

6
推荐指数
3
解决办法
5439
查看次数