给定Win32 COM接口定位其类型库

时间:2014-06-04 09:54:42

标签: com clsid

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

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

实际上某处是某种类型库定义(可能是某些dllexe的资源)?如果是这样,我该怎么做呢?

1 个答案:

答案 0 :(得分:3)

您可以从intshcut.h SDK头文件中了解到查找类型库没有意义。

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

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

但是类型库有局限性,它们最初设计用于很好地支持Automation子集,但不能表达所有可能的声明。与任何语言互操作的需要可能是非常严格的,或者导致太多的开销被认为是合适的。因此,微软的程序员并不罕见地手工制作.h文件。仍然使用COM编程样式与从IUnknown派生但不使用IDL声明它们的接口。最常见的例子是shell接口和DirectX。

总结一下,强烈暗示你很难找到一个类型库:

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

intshcut.h头文件几乎击中了所有这些子弹。您必须手动制作[ComImport]接口声明。是的,非常痛苦,小错误很难诊断出运行时错误。请记住,某个地方的某个程序员可能会做你想做的事情。运气好的话,谷歌会帮你找到他的代码。请记住,您总是可以回退到C ++ / CLI,这种语言非常适合这种互操作,因为它可以直接使用.h文件。