【问题标题】:Given a Win32 COM interface locate its typelib给定一个 Win32 COM 接口,找到它的 typelib
【发布时间】:2014-06-04 09:54:41
【问题描述】:

考虑在intshcut.h 中定义的IUniformResourceLocator 接口。我知道如何为托管 COM 互操作手动定义它,但我试图了解是否可以让 tlbimp 为我做这件事。这是我尝试过的:

  • 网上搜索-我只能找到头文件和CLSID
  • 在注册表中搜索 CLSID - 我只在 ShellEx 文件夹中找到它,没有二进制路径
  • findstr [CLSID] /s *.* 位于 system32 和 Windows SDK 文件夹中

实际上在某处是否有它的类型库定义(可能作为某些dllexe 的资源)?如果是这样,我该如何解决?

【问题讨论】:

    标签: com clsid


    【解决方案1】:

    您可以从 intshcut.h SDK 头文件中看出,寻找类型库是没有意义的。

    Microsoft 代码中类型库的正常来源是 midl.exe,它是翻译用 IDL(接口描述语言)编写的声明的编译器。这从一个 .idl 文件开始,SDK 包含了很多文件,尽管不一致。 Midl 从 IDL 自动生成一个 .h 文件,您可以通过自动生成的 /* 这个 ALWAYS GENERATED 文件包含接口的定义 */ 注释来​​识别它们。该 .h 文件适用于 C 或 C++。它会生成一个类型库,通常作为资源嵌入到 DLL 中,适用于其他语言。

    您可以通过使用 Regedit.exe 在注册表中查找来找到此类类型库。起点是 HKLM\Software\Classes\Typelib 键,查找与 IDL 中 library 关键字上的 [uuid] 属性匹配的 guid。

    但是类型库有局限性,它们最初是为了很好地支持自动化子集而设计的,但不能表达所有可能的声明。与任何语言互操作的需求可能非常受限,或者导致过多的开销被认为是合适的。因此,Microsoft 程序员通常会手工制作 .h 文件。仍然使用从 IUnknown 派生的接口的 COM 编程风格,但不使用 IDL 来声明它们。最常见的例子是 shell 接口和 DirectX。

    总结,强烈的暗示,你几乎没有希望找到类型库:

    • 派生自 IUnknown 而不是 IDispatch 的接口。 IDispatch 是自动化最喜欢的基础接口,它支持后期绑定。脚本语言使用的那种
    • 不是由 midl.exe 自动生成的 .h 文件,强烈提示未使用 IDL
    • 缺少 .idl 文件。不是一个完整的灌篮高手,微软有时只提供从 .idl 生成的 .h 文件,原因我不清楚
    • IDL 中存在 cpp_quote()。将 C++ 声明注入生成的 .h 文件是一个后门,这种文件在 IDL 中不容易声明。不是灌篮高手,而是一个强烈的信号,您将无法以 C++ 以外的语言使用该库。
    • 存在返回接口类型的工厂函数。一个非常强烈的暗示,普通的 COM 类工厂不用于创建同类,即您使用 CoCreateInstance() 函数调用的那种
    • .h 文件中存在本机 Windows 类型定义,如 HWND 和 LPCWSTR。或作为原始指针传递的数组。它们不兼容自动化。

    intshcut.h 头文件几乎涵盖了所有这些项目符号。您必须手工制作 [ComImport] 接口声明。是的,非常痛苦的小错误会产生非常难以诊断的运行时错误。请记住,在某个地方很可能有另一个程序员在做您想做的事情。运气好的话,谷歌会帮你找到他的代码。请记住,您始终可以回退到 C++/CLI,这是一种非常擅长这种互操作的语言,因为它可以直接使用 .h 文件。

    【讨论】:

    • 当他们将 Raymond Chen 命名为 Win32 Chuck Norris 时,你完全被抢劫了
    • 呵呵,十年前就应该开始写博客了。谢谢:)
    猜你喜欢
    • 2011-01-22
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 2010-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    相关资源
    最近更新 更多