- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用过通过 COM 接口(interface)访问的第三方库。
对于一些测试,我创建了主表单:
TForm1 = class (TForm, IThirdParyCOMInterface)
TForm1 实现了 IThirdParyCOMInterface 的所有方法,并且我获得了所需的功能。
下一步是创建一个单独的类,仅用于处理此 COM 接口(interface)。
做这样的事情:
TMyClass = class (TInterfacedObject, IThirdParyCOMInterface)
导致编译器错误:
E2291 Missing implementation of interface method IDispatch.GetTypeInfoCount
E2291 Missing implementation of interface method IDispatch.GetTypeInfo
E2291 Missing implementation of interface method IDispatch.GetIDsOfNames
E2291 Missing implementation of interface method IDispatch.Invoke
( IThirdPartyCOMInterface = 接口(interface) (IDispatch) )
看来 TForm 已经实现了这些 IDispatch 方法,但我的新简单类没有。
我怎样才能为上面这样的新类做到这一点?
我应该从哪个类继承我的新类,以便这些 IDispatch 方法已经实现?
编辑:
我刚刚找到了 TAutoIntfObject。这是我需要的吗?
(COM 对我来说有点困惑,我只是在这里猜测)
最佳答案
在 COM 中要做的传统事情是将 COM 接口(interface)与表单分开,尤其是当您正在编写充当自动化服务器(又名 DCOM 服务器)的 EXE 进程时。
哎呀,即使您正在编写您不想变成一个巨大的泥球的普通 Delphi 应用程序,这样做也是传统的做法。因此,问问自己为什么要让 FORM 实现您的调度接口(interface)。即使在快速而肮脏的演示中,将 COM 服务器类和表单合并起来也很有趣,您不需要这样做。
双接口(interface)(自动化)对象通常构建为其自己的类,该类可能私下引用您的表单。我建议您尝试这样做。
IThirdPartyComInterface
应该由您自己的类TThirdPartyComInterface
实现,并且应该是一个双COM(Native vtable + Dispatch)对象。
然后您应该注册您的 COM 服务器对象,然后您就可以开始工作了。
有各种教程,但似乎没有一个是最新的。这是 Delphi 7. 的一个
也许最好的地方是 DocWiki这将向您显示 Com 对象向导,您应该使用它来创建 TThirdPartyComInterface 类,该类将同时实现 IDispatch 和 native VTable COM(更高性能)。您可以将 IDispatch 侵入您的 TForm,但每次您这样做时,我选择的次神或执政官都会处决我选择的毛茸茸的小动物。不要这样做。想想你正在杀死的所有那些毛茸茸的小动物。
关于delphi - 如何实现IDispatch方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10964810/
我目前正在开发一个 COM 服务器(使用 ATL)供闭源 VB 使用应用。到目前为止一切正常,但我想确保没有泄漏那里...所以我的问题是: 我是否必须在通过以下方式获得的 IDispatch 指针上调
我想枚举一台机器上的所有 IDispatch 支持对象。目前我需要知道类 ID 或程序 ID 是什么,但是为了检查我的机器,我想知道我是否可以枚举所有实现 IDispatch 的对象。 这可能吗? 任
我有一个 ATL COM 组件,它引发一些由托管(C# 和 VB.NET)代码处理的事件。该组件当前由 VS2005 VB.NET 项目(作为 ActiveX 控件)使用,并且引发了所有事件并且一切正
我正在使用 ATL 将旧的 VB COM 对象(不是我写的)转换为 C++。根据 IDL,其中一种方法采用 IDispatch* 作为参数,此方法的文档和示例声称您可以传递一个字符串(这是一个对象的
我一直在考虑尝试使用实现 OPOS 服务对象的 C# 编写 COM 对象。我已经使用 Automation 和 MFC 在 C++ 中完成了它,这并不太难。所以我一直坚持尝试将其转换的方法之一。我将排
我用一个简单的 COM 对象编写了一个简单的 COM DLL inproc 服务器。 COM 对象实现了一个连接点。 我知道如何创建从 IDispEventImpl 派生的 ATL 客户端,并使用接收
在第三方 COM 模块中,我必须将结构传递给方法。 IDL 定义的重要部分如下所示: interface ITheirInterface : IDispatch { [id(0x0000012
我在我的 C++ 程序中托管一个 IWebBrowser2 控件,只使用普通的 Win32(没有 mfc、atl、wtl 等)。在 DISPID_NAVIGATECOMPLETE2 上,我添加了一个自
我在返回 HRESULTS 的 WMI/WBEM 接口(interface)上调用方法。我想向用户显示这些错误代码的有意义的错误消息。但是,当我查找 HRESULT 的错误消息时,我只得到类似“IDi
今天我带来了另一个让我头疼的问题, 我确实将一个 DAO 3.6 类型库导入到我的 delphi 7 中,并且我开始看到许多有趣的接口(interface),所以我面临着一个有趣的问题。 每次Fiel
如何在Delphi中释放IDispatch COM对象?我必须这样做吗? type IUtility = interface(IDispatch); var obj: IUtility; beg
如果我使用错误的参数数量/类型通过 IDispatch(后期绑定(bind))调用 COM 对象的方法,是否会返回一些错误代码,或者程序会崩溃或出现其他故障?我只想知道使用 IDispatch 进行后
明天我计划做一些 IDispatch 相关的工作,我将不得不创建一个支持这个接口(interface)的类。 我一直在使用 ATL 类来创建 COM 对象和管理 COM 指针,所以我也想将它们用于我的
我有一个函数,它通过参数(项目)返回一个指向接口(interface)指针的指针: CreateProject(std::string str, IDispatch** project); 鉴于另外两
我一直在用 C# 开发 Web 服务,以将网站与本地数据库链接起来。本地应用程序的 SDK 是一个 COM 对象。第二天,我开始思考如何将下面的 VB 代码(在 SDK 协议(protocol)中给出
继续 this question ,我很困惑 IDispatch::Invoke() 上的 DISPID_VALUE 是否可以将脚本函数和属性(在我的例子中是 JavaScript)视为调用实际函数的
我在使用 IDispatch.Invoke 调用具有浮点参数和浮点结果的函数时遇到问题。 这是一个最小的复制: #include #include int main(int argc, char*
我不知道是否有人熟悉 BHO(浏览器助手对象),但是 c++ 专家也可以帮助我。 在我的 BHO 中,我只想在主框架上运行 OnDocumentComplete() 函数 - 第一个容器,而不是当前页
我正在编写一些测试代码来模拟调用我的延迟绑定(bind) COM 对象的 C# 实现的非托管代码。我有一个声明为 IDispatch 类型的接口(interface),如下所示。 [Guid("2D
我是物理学家。我正在尝试使用导入的 activex 控件(ocx 文件)在 Delphi 上工作。假设库中有 3 个自动化接口(interface):IGraph、IGraphAxes 和 IAxis
我是一名优秀的程序员,十分优秀!