考虑intshcut.h
中定义的IUniformResourceLocator接口。我知道如何为托管COM互操作手动定义它,但我试图了解我是否可以让tlbimp
为我做这件事。以下是我尝试过的内容:
ShellEx
文件夹中找到它,没有二进制路径findstr [CLSID] /s *.*
system32
和Windows SDK文件夹实际上某处是某种类型库定义(可能是某些dll
或exe
的资源)?如果是这样,我该怎么做呢?
答案 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。
总结一下,强烈暗示你很难找到一个类型库:
intshcut.h头文件几乎击中了所有这些子弹。您必须手动制作[ComImport]接口声明。是的,非常痛苦,小错误很难诊断出运行时错误。请记住,某个地方的某个程序员可能会做你想做的事情。运气好的话,谷歌会帮你找到他的代码。请记住,您总是可以回退到C ++ / CLI,这种语言非常适合这种互操作,因为它可以直接使用.h文件。