我曾经认为 Delphi 中关于接口的类型安全是通过为它设置一个唯一的(可选的,但如果填写的话是唯一的)GUID 来维护的。
然后出现了这个问题:通过 OLE 调用 Word CentimetersToPoints 时出现未指定错误
对此很少跟进: http: //pastebin.ca/2369858
我开始寻找库存的德尔福TWordApplication
组件(即Word200.pas
单元)。我看到了:
// *********************************************************************//
// Interface: _Application
// Flags: (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
// GUID: {00020970-0000-0000-C000-000000000046}
// *********************************************************************//
_Application = interface(IDispatch)
['{00020970-0000-0000-C000-000000000046}']
...
function CentimetersToPoints(Centimeters: Single): Single; safecall;
// *********************************************************************//
// DispIntf: _ApplicationDisp
// Flags: (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
// GUID: {00020970-0000-0000-C000-000000000046}
// *********************************************************************//
_ApplicationDisp = dispinterface
['{00020970-0000-0000-C000-000000000046}']
...
function CentimetersToPoints(Centimeters: Single): Single; dispid 371;
或类似的:
// *********************************************************************//
// Interface: _Global
// Flags: (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
// GUID: {000209B9-0000-0000-C000-000000000046}
// *********************************************************************//
_Global = interface(IDispatch)
['{000209B9-0000-0000-C000-000000000046}']
...
function CentimetersToPoints(Centimeters: Single): Single; safecall;
// *********************************************************************//
// DispIntf: _GlobalDisp
// Flags: (4560) Hidden Dual NonExtensible OleAutomation Dispatchable
// GUID: {000209B9-0000-0000-C000-000000000046}
// *********************************************************************//
_GlobalDisp = dispinterface
['{000209B9-0000-0000-C000-000000000046}']
...
function CentimetersToPoints(Centimeters: Single): Single; dispid 371;
我在这里完全迷失了。
我以前认为是like todispinterface
的“子类” ?如果是,那么如何在同一个项目中有两个具有相同 GUID 的接口?interface
TPersistent
TObject
还是它们来自不同的不相关框架,例如 Delphi 新class
类型到继承的 TurboPascalobject
类型?既不_GlobalDisp
也不_ApplicationDisp
似乎被使用,Word200.pas
所以它们就像附录一样,自动导入但从未实际使用过?
我制作了这个项目,同时使用_Application
和_ApplicationDisp
编译。但是我只是想知道如果他们有相同的 GUID,Delphi 是如何打字的?
procedure TForm4.Button1Click(Sender: TObject);
procedure show(const s: Single);
begin
ShowMessage(FloatToStr(s));
end;
begin
show( WordApplication1.CentimetersToPoints(1.0) );
show( WordApplication1.Application.CentimetersToPoints(2.0) );
show( WordApplication1.DefaultInterface.CentimetersToPoints(3.0) );
show( _ApplicationDisp(WordApplication1.Application).CentimetersToPoints(4.0) );
show( (WordApplication1.DefaultInterface as _ApplicationDisp).CentimetersToPoints(5.0) );
end;