给定一个 Win32 COM 接口,如何找到它的类型库?

3
考虑到在intshcut.h中定义的IUniformResourceLocator接口。我知道如何为托管COM互操作手动定义它,但我试图了解是否可以让tlbimp为我完成这项工作。以下是我的尝试:
  • 网上搜索-我只能找到头文件和CLSID
  • 在注册表中搜索CLSID-我只在ShellEx文件夹中找到它,没有二进制路径
  • findstr [CLSID] /s *.*system32和Windows SDK文件夹中都执行了这个命令

是否实际上有某个类型库定义它(可能作为某个dllexe的资源)?如果是,我该如何找到它?

1个回答

4
你可以从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是自动化的最喜欢基础接口,它支持后期绑定。脚本语言使用的那种
-.h文件不是由midl.exe自动生成的,这提供了一个强烈的暗示没有使用IDL
-.idl文件的缺失。不是完全的slamdunk,Microsoft有时仅出售从.idl生成的.h文件,原因对我来说不清楚
-在IDL中存在cpp_quote()。这是一个后门,用于将C ++声明注入生成的.h文件中,这种声明在IDL中不能轻松声明。不是slamdunk,但是你会发现在除C ++之外的语言中使用该库会有麻烦。
-具有返回接口类型的工厂函数的存在。非常强烈地暗示正常的COM类工厂未用于创建co-class,这是您使用CoCreateInstance()函数调用的一种。
-.h文件中存在本机Windows typedefs,如HWND和LPCWSTR。或者作为原始指针传递的数组。它们不兼容自动化。

intshcut.h头文件几乎涵盖了所有这些要点。您需要手动编写[ComImport]接口声明。是的,非常痛苦,小错误会导致非常难以诊断的运行时错误。请记住,可能有另一个程序员做了你想做的事情。有些运气的话,谷歌可以帮助您找到他的代码。而且请记住,您始终可以退回到C++ / CLI语言,因为它可以直接使用.h文件。


1
当他们将Raymond Chen称为Win32 Chuck Norris时,你完全被抢劫了。 - Ohad Schneider
1
呵呵,应该十年前就开始写博客了。谢谢 :) - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接