您可以从 intshcut.h SDK 头文件中看出,寻找类型库是没有意义的。
Microsoft 代码中类型库的正常来源是 midl.exe,它是翻译用 IDL(接口描述语言)编写的声明的编译器。这从一个 .idl 文件开始,SDK 包含了很多文件,尽管不一致。Midl 从 IDL 自动生成一个 .h 文件,您可以通过自动生成的 /* 这个 ALWAYS GENERATED 文件包含接口的定义 */ 注释来识别它们。该 .h 文件适用于 C 或 C++。它生成一个类型库,通常作为资源嵌入到 DLL 中,适用于其他语言。
您可以通过使用 Regedit.exe 在注册表中查找来找到此类类型库。起点是 HKLM\Software\Classes\Typelib 键,查找与library
IDL 中关键字的 [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 文件。