如何为shell32.dll中的IFileDialog类找到GUID ?
本文关键字:GUID IFileDialog 中的 shell32 dll | 更新日期: 2023-09-27 18:08:16
我一直在尝试使用ComImport为我正在编写的c#应用程序在各种dll中设置一些win32类的互操作。我不明白的是你如何找到一个类的GUID ?我找到了一些可以工作的导入示例,但我不确定作者是如何找到类的GUID的。下面列出了一个导入IFileDialog及其方法的示例。
[ComImport(), Guid("42F85136-DB7E-439C-85F1-E4075D135FC8"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IFileDialog {
[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
[PreserveSig()]
uint Show([In, Optional] IntPtr hwndOwner); //IModalWindow
我正在使用Visual Studio 2012,我可以看到如何在COM选项卡上的Microsoft Shell控件和自动化中添加对shell32.dll的引用,但这似乎对我没有任何帮助。我遗漏了什么?在哪里可以找到GUID?是否有某种方法可以让Visual Studio生成上面列出的代码,或者我需要找到每个类的GUID,然后编写上面列出的方法导入?
COM服务器大致分为两类。"简单"类型使用COM的一个子集,称为自动化。它最初是作为Visual Basic version 4的扩展模型设计的。它非常成功,几乎所有Windows上的语言运行时都支持它。您通常从它们继承自IDispatch
的接口来识别它们。
它们很简单,主要是因为它们支持类型库。它是服务器支持的接口的独立于语言的描述,包括它们的指南。类型库就像。net中的元数据。使用同样的方法,编译器可以读取它并知道如何对代码执行类型检查并提供自动完成。DLL中有一个,它作为资源嵌入到DLL中。它是非常有限的,只是为了让脚本语言访问一些shell功能。
然后是"硬"的那种。您通常从它们从IUnknown
继承的接口中识别它们。它们只在c++中易于使用,没有类型库,也无法创建类型库,因为它们倾向于使用与自动化不兼容的类型。Windows的主要部分只能使用这样的接口,shell和DirectX是最著名的例子。你可以在c#中使用它们,但是你必须手工编写[ComImport]接口,就像你做的那样。
这些接口的声明存在于Windows SDK的.h文件中。大多数程序员在他们的机器上都有7.1版本,这取决于他们的VS版本,位于c:'program files (x86)'microsoft sdk 'windows'v7.1a'include。所以你可以做的一件简单的事情就是在VS中使用编辑+查找和替换+在文件中查找菜单命令,然后在目录中搜索"IFileDialog"。持久性有机污染物:
MIDL_INTERFACE("42f85136-db7e-439c-85f1-e4075d135fc8")
IFileDialog : public IModalWindow
// etc...
}
为什么它继承了IModalWindow而不是IUnknown,你从来没有在你的c#声明中提到它,这是另一天的故事:)