给定Win32 COM接口,请找到其类型库

给定Win32 COM接口,请找到其类型库,com,clsid,Com,Clsid,考虑intshcut.h中定义的接口。我知道如何为托管COM互操作手动定义它,但我试图了解是否可以让tlbimp为我这样做。以下是我尝试过的: 搜索web-我只能找到头文件和CLSID 在注册表中搜索CLSID-我只在ShellEx文件夹中找到它,没有二进制路径 system32和Windows SDK文件夹中的的的findstr[CLSID]/s* 事实上,在某个地方是否有它的类型库定义(可能作为某些dll或exe的资源)?如果是这样的话,我该如何对其进行fid?从intshcut.h S

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

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

事实上,在某个地方是否有它的类型库定义(可能作为某些
dll
exe
的资源)?如果是这样的话,我该如何对其进行fid?

从intshcut.h SDK头文件可以看出,找类型库没有意义

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

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

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

总之,强烈提示您找到类型库的希望很小:

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

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

当他们将Raymond Chen命名为Win32 Chuck NorrisHehe时,您完全被抢了。Chuck NorrisHehe应该在十年前创建一个博客。谢谢:)