delphi – 具有相同GUID的两个接口的相关性交互是什么

delphi – 具有相同GUID的两个接口的相关性交互是什么,第1张

概述我以前认为Delphi中关于Interfaces的类型安全性是通过设置一个唯一的(可选的,但唯一的,如果填充的)GUID来维护的. 然后出现了这个问题:Unspecified error when calling Word CentimetersToPoints via OLE 几乎没有跟进:http://pastebin.ca/2369858 我开始寻找现货Delphi TWordApplica 我以前认为Delphi中关于Interfaces的类型安全性是通过设置一个唯一的(可选的,但唯一的,如果填充的)GUID来维护的.

然后出现了这个问题:Unspecified error when calling Word CentimetersToPoints via OLE
几乎没有跟进:http://pastebin.ca/2369858

我开始寻找现货Delphi 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;

我觉得这里完全迷失了.

我以前认为dispinterface是接口的“子类”,如TOERS的TPersistent是?如果是,那么如何在同一个项目中具有相同GUID的两个接口?

或者它们来自不同的不相关框架,如Delphi新类类继承TurboPascal对象类型? _Globaldisp和_Applicationdisp似乎都没有在Word200.pas中使用,所以它们就像附录,自动导入但从未实际使用过吗?

我使用_Application和_Applicationdisp创建了该项目并进行编译.但后来我只想知道如果他们有相同的指南,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;
解决方法 dispinterface实际上只是将Idispatch用于自动化接口的便捷方式.这就是他们拥有相同GUID的原因 – 它们在幕后完全相同.

使用Idispatch调用方法时,通常必须调用GetIDsOfnames以获取方法的调度ID.但由于这些是静态的,如果您知道调度ID,则可以通过跳过该步骤来节省时间.这就是dispinterface允许你做的事情.

当您在调度接口上调用方法时,您仍然最终在Idispatch上调用Invoke,但是您跳过对GetIDsOfnames的调用.

当您使用带接口的queryInterface时,您将获得Idispatch.然后,您可以将其强制转换为相应的调度接口.它仍然是相同的接口,但是当您在dispinterface上调用方法时,您将保存对GetIDsOfnames的调用.

因此,如果您有Word应用程序对象的Idispatch,比如说,您可以编写如下代码:

var  WordApp: Variant;  Worddisp: _Applicationdisp;....WordApp := CreateoleObject('Word.Application');Worddisp := _Applicationdisp(Idispatch(WordApp));

_Applicationdisp()强制转换只不过是对Intfcopy的调用.反过来,这只不过是对_AddRef的调用.然后你可以写:

Writeln(WordApp.ProductCode);Writeln(Worddisp.ProductCode);

两者都产生相同的输出.前者在调用Invoke之前首先调用GetIDsOfnames.后者直接进入Invoke.

总结

以上是内存溢出为你收集整理的delphi – 具有相同GUID的两个接口的相关性交互是什么全部内容,希望文章能够帮你解决delphi – 具有相同GUID的两个接口的相关性交互是什么所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1237520.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存