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

Import a dll file into another IDL file

本文关键字:文件 IDL 另一个 导入 dll      更新时间:2023-10-16

我正在为visual C++中的给定组件开发代理COM组件。如果"Comp"是原始组件,而Proxy_Comp是代理组件,那么Proxy_Comp应该能够具有与原始组件相同的接口。

我认为这应该通过只导入"Comp.dll"来完成。我的一个朋友以前成功地做到了这一点。但我做不到。有人能帮忙吗?

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

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

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

关闭该窗口并右键单击"1",注意"导出"上下文菜单选项。这可以让你在磁盘上写一个文件,命名为.tlb。你现在就有了importlib()指令喜欢的.tlb的精确副本。

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

只有当原始.idl文件是COM Automation干净的并且不包含任何cpp_quote时,它才具有100%的保真度。

您需要类型库中的接口定义(嵌入DLL中的.tlb数据)。如果您安装了Windows SDK实用程序(可能与VS一起安装),则为DLL运行OLE/COM对象查看器和"文件"、"查看类型库"。这将为您提供一个IDL转储,您可以从中复制接口定义。

(如果您想要的是在IDL编译时导入.tlb数据,也可能有一种方法,但我不确定,对不起。)