将dll文件导入另一个IDL文件

时间:2012-01-03 23:49:41

标签: c++ visual-studio visual-c++ com

我正在开发一个项目,用于在visual C ++中为给定组件开发代理COM组件。 如果“Comp”是原始组件而Proxy_Comp是代理组件,则Proxy_Comp应该能够具有与原始组件相同的接口。

我认为这应该只通过导入“Comp.dll”来完成。 我的一位朋友之前成功完成了这项工作。但我不能这样做。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

我假设你在谈论IDL文件中的 importlib 指令。它需要一个类型库,文件扩展名为.tlb。它是通过在.idl文件上运行midl.exe生成的二进制文件,该文件包含紧凑形式的.idl定义。

DLL不是类型库。但是,COM Automation中的常见约定是将COM服务器的类型库作为DLL内的资源嵌入。将服务器代码及其接口定义保持在一起非常方便。您可以从Visual Studio轻松地看到这一点,使用File + Open + File并选择DLL。您可以选择c:\ windows \ system32 \ shell32.dll作为示例。

资源类型名称总是“TYPELIB”,打开节点查看资源ID,总是“1”。你可以双击它来查看内容,不是很有趣,因为它只是一个十六进制转储。您将识别字符串,接口,coclasses及其成员的名称。

关闭该窗口并右键单击“1”,注意“导出”上下文菜单选项。这允许您将文件写入磁盘,将其命名为something.tlb。您现在将拥有importlib()指令所喜欢的.tlb的精确副本。

可以依次反编译.tlb以重新生成原始.idl文件。启动Visual Studio提示符。运行oleview.exe,File + Open Typelib并选择.tlb。将焦点设置到右侧窗格,键入Ctrl + A,Ctrl + C并将其粘贴到文本编辑器中。现在你得到了原来的.idl,你可以使用 import 指令。

如果原始.idl文件是COM自动化干净并且不包含任何cpp_quote,则它只有100%的保真度。

答案 1 :(得分:2)

您需要类型库中的接口定义(嵌入在DLL中的.tlb数据)。如果您安装了Windows SDK实用程序(可能使用VS),则为您的DLL运行OLE/COM Object Viewer和“File”,“View Typelib”。这应该为您提供一个IDL转储,您可以将接口定义复制出来。

(可能还有一种方法可以在IDL编译时导入.tlb数据,如果这就是你所追求的,但我不确定对不起。)