【问题标题】:Import a dll file into another IDL file将一个 dll 文件导入另一个 IDL 文件
【发布时间】:2012-02-01 23:13:04
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    我假设您正在讨论 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 文件并在运行时生成代理组件。我为代理组件中的接口创建了新的 UUID。但与其使用新的 UUID 创建新接口,我应该能够使这些接口指向原始组件的接口。你能告诉我该怎么做吗?
    • 库 CalcProxyLib { importlib("stdole2.tlb"); importlib("C:\Users\Uma\Documents\Visual Studio 2008\Projects\Tutorial\Calc\Windows Mobile 5.0 Pocket PC SDK (ARMV4I)\Debug\Calc.tlb");接口 IDocHostUIHandlerDispatch;接口 IAxWinAmbientDispatchEx; [ uuid(2c43e5f4-b9e3-421f-8131-3d61ddc84446), helpstring("Hello Class") ] coclass Helloproxy { [默认] interface IHello; }; };
    • COM 没有一种机制可以将一个接口实现替换为标准单元互操作代理之外的另一个接口实现。像 CoCreateInstance() 这样的客户端程序调用将始终创建在注册表中选择的 coclass 的实例。您可以更改该注册,但是您必须找到一种方法来创建原始实现,以便您可以将代理的方法调用委托给原始实现。不存在为此的标准机制,完全取决于您是否正确。
    【解决方案2】:

    您需要来自类型库的接口定义(嵌入在 DLL 中的 .tlb 数据)。如果您安装了 Windows SDK 实用程序(可能与 VS 一起),则为您的 DLL 运行 OLE/COM Object Viewer 和“文件”、“查看 Typelib”。这应该会给您一个 IDL 转储,您可以从中复制接口定义。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-22
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      相关资源
      最近更新 更多