首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现IDispatch方法?

如何实现IDispatch方法?
EN

Stack Overflow用户
提问于 2012-06-09 21:45:01
回答 2查看 4.6K关注 0票数 2

我玩过一个第三方库,它是通过COM接口访问的。

对于一些测试,我创建了主表单如下:

代码语言:javascript
复制
TForm1 = class (TForm, IThirdParyCOMInterface)

TForm1实现了IThirdParyCOMInterface的所有方法,我得到了所需的功能。

下一步是创建一个单独的类,只用于处理这个COM-Interface。

做这样的事:

代码语言:javascript
复制
TMyClass = class (TInterfacedObject, IThirdParyCOMInterface)

编译器错误的结果:

E2291缺少接口方法IDispatch.GetTypeInfoCount的实现 E2291缺少接口方法IDispatch.GetTypeInfo的实现 E2291缺少接口方法IDispatch.GetIDsOfNames的实现 E2291缺少接口方法IDispatch.Invoke的实现

( IThirdPartyCOMInterface =接口(IDispatch) )

看来TForm已经实现了这些IDispatch方法,但是我的新的简单类没有实现。

我怎样才能为像上面这样的新类做这件事呢?

我应该从哪个类继承我的新类,以便这些IDispatch方法已经实现?

编辑:

我刚找到TAutoIntfObject。这就是我需要的吗?

(COM有点让我感到困惑,我只是在这里猜测)

EN

回答 2

Stack Overflow用户

发布于 2012-06-10 02:50:26

在COM中要做的传统事情,特别是当您正在编写作为自动化服务器(又名DCOM Server)的EXE进程时,是将COM接口与表单分开。

见鬼,即使在编写正常的Delphi应用程序时,你也不想变成一个巨大的泥球,这也是传统的做法。因此,问问自己为什么要让表单实现您的调度接口。即使在一个快速而肮脏的演示中,将COM Server类和表单混为一谈只是你不需要拥有的乐趣。

双接口(自动化)对象通常是作为它们自己的类构建的,这些类可能私下中引用您的表单。我建议你这样做。

IThirdPartyComInterface应该由您自己的类TThirdPartyComInterface实现,并且应该是一个双COM(本机vtable +调度)对象。

然后,您应该注册您的COM服务器对象,然后您将进行业务。

有各种各样的教程,但似乎没有最新的。这是德尔菲7。的一个

也许最好的选择是DocWiki,它将向您展示Com对象向导,您应该使用它来创建实现IDispatch的TThirdPartyComInterface类,再加上本地的VTable COM (更高的性能)。你可以把IDispatch黑进你的TForm,但是每次你这么做的时候,我选择的一个亚神或弓箭手就会执行我选择的一只毛茸茸的小动物。不要这样做。想想你要杀的那些毛茸茸的小动物。

票数 5
EN

Stack Overflow用户

发布于 2012-06-11 13:32:55

尝试使用TAutoObject而不是TInterfacedObject。前者实现IDispatch,后者只实现IUnknown。(它在ComObj单元中)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10964810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档