2

我玩过一个通过 COM 接口访问的第三方库。
对于一些测试,我创建了主要形式:

TForm1 = class (TForm, IThirdParyCOMInterface)

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

下一步是创建一个单独的类,仅用于处理此 COM 接口。
做这样的事情:

TMyClass = class (TInterfacedObject, IThirdParyCOMInterface)

导致编译器错误:

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

( IThirdPartyCOMInterface = interface (IDispatch) )
似乎 TForm 已经实现了这些 IDispatch 方法,但我的新简单类没有。

我怎样才能为像上面这样的新课程做到这一点?
我应该从哪个类继承我的新类,以便这些 IDispatch 方法已经实现?

编辑:
我刚刚找到 TAutoIntfObject。那是我需要的吗?
(COM 让我有点困惑,我只是在这里猜测)

4

2 回答 2

5

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

哎呀,即使您正在编写不想变成巨型泥球的普通 Delphi 应用程序,这样做也是传统的做法。所以问问自己为什么要让 FORM 实现你的调度接口。即使在一个快速而肮脏的演示中,将 COM Server 类和表单混为一谈也很有趣,您不需要拥有。

双界面(自动化)对象通常构建为它们自己的类,它可能私下引用您的表单。我建议你检查一下这样做。

IThirdPartyComInterface应该由你自己的类实现TThirdPartyComInterface,并且应该是一个双COM(Native vtable + Dispatch)对象。

然后,您应该注册您的 COM 服务器对象,然后您就可以开展业务了。

有各种教程,但似乎都不是最新的。这是Delphi 7 的一个。

也许最好的去处是DocWiki,它将向您展示 Com 对象向导,您应该使用它来创建您的 TThirdPartyComInterface 类,该类将同时实现您的 IDispatch,以及本机 VTable COM(更高性能)。您可以将 IDispatch 入侵到您的 TForm 中,但每次您这样做时,我选择的子神或执政官都会执行我选择的小型毛茸茸的动物。不要这样做。想想你正在杀死的那些毛茸茸的小动物。

于 2012-06-10T02:50:26.187 回答
2

尝试使用TAutoObject而不是TInterfacedObject. 前者实施IDispatch,后者只实施IUnknown。(在ComObj单位里)

于 2012-06-11T13:32:55.770 回答