【发布时间】:2012-02-01 23:13:04
【问题描述】:
我正在为 Visual C++ 中的给定组件开发代理 COM 组件的项目。 如果“Comp”是原始组件,Proxy_Comp 是代理组件,那么 Proxy_Comp 应该能够具有与原始组件相同的接口。
我认为这应该通过仅导入“Comp.dll”来完成。 我的一个朋友以前成功地做到了这一点。但我做不到。有人可以帮忙吗?
【问题讨论】:
标签: c++ visual-studio visual-c++ com
我正在为 Visual C++ 中的给定组件开发代理 COM 组件的项目。 如果“Comp”是原始组件,Proxy_Comp 是代理组件,那么 Proxy_Comp 应该能够具有与原始组件相同的接口。
我认为这应该通过仅导入“Comp.dll”来完成。 我的一个朋友以前成功地做到了这一点。但我做不到。有人可以帮忙吗?
【问题讨论】:
标签: c++ visual-studio visual-c++ com
我假设您正在讨论 IDL 文件中的 importlib 指令。它需要一个类型库,文件扩展名为 .tlb。它是通过在 .idl 文件上运行 midl.exe 生成的二进制文件,该文件包含紧凑形式的 .idl 定义。
DLL 不是类型库。然而,在 COM 自动化中,将 COM 服务器的类型库作为资源嵌入到 DLL 中是一种常见的约定。将服务器代码及其接口定义放在一起非常方便。您可以从 Visual Studio 轻松看到这一点,使用 File + Open + File 并选择 DLL。您可以选择 c:\windows\system32\shell32.dll 作为示例。
资源类型名称一律为“TYPELIB”,打开节点查看资源ID,一律为“1”。您可以双击它来查看内容,这不是很有趣,因为它只是一个十六进制转储。不过,您会认出这些字符串、接口名称、coclass 及其成员。
关闭该窗口并右键单击“1”,注意导出上下文菜单选项。这使您可以将文件写入磁盘,将其命名为 something.tlb。您现在将拥有 importlib() 指令喜欢的 .tlb 的精确副本。
该.tlb 可以依次反编译以重新生成原始.idl 文件。启动 Visual Studio 提示符。运行 oleview.exe,文件 + 打开 Typelib 并选择 .tlb。将焦点设置到右窗格,键入 Ctrl+A、Ctrl+C 并将其粘贴到文本编辑器中。现在你得到了原始的 .idl,你可以使用 import 指令。
如果原始 .idl 文件是 COM 自动化干净且不包含任何 cpp_quote,则只有 100% 保真度。
【讨论】:
您需要来自类型库的接口定义(嵌入在 DLL 中的 .tlb 数据)。如果您安装了 Windows SDK 实用程序(可能与 VS 一起),则为您的 DLL 运行 OLE/COM Object Viewer 和“文件”、“查看 Typelib”。这应该会给您一个 IDL 转储,您可以从中复制接口定义。
(如果这是您所追求的,也可能有一种方法可以在 IDL 编译时导入 .tlb 数据,但我不确定抱歉。)
【讨论】: