在C#中使用ComImport,如何在shell32.dll中找到像IFileDialog这样的类的GUID?

我一直在尝试使用ComImport为我正在编写的C#应用​​程序设置一些与各种dll中的win32类的互操作。 我不明白你是如何找到class级的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服务器大致分为两类。 “简单”类使用一个名为Automation的COM子集。 它最初被设计为Visual Basic版本4的扩展模型。非常成功,几乎任何Windows上的语言运行时都支持它。 您通常会从inheritance自IDispatch的接口识别它们。

它们最简单,因为它们支持类型库。 这是与服务器支持的接口的语言无关描述,包括其guid。 类型库就像.NET中的元数据一样。 并以相同的方式使用,编译器可以读取它并知道如何对代码执行类型检查并提供自动完成function。 Shell32.dll有一个,它作为资源嵌入在DLL中。 它非常有限,只是为了让脚本语言能够访问某些shellfunction。

那就是“硬”的那种。 您通常会从inheritance自IUnknown的接口识别它们。 它们只能从C ++中轻松使用,它们没有类型库,您也无法创建它们,因为它们倾向于使用不兼容自动化的类型。 Windows的主要部分仅适用于此类接口,shell和DirectX是最着名的示例。 你可以在C#中使用它们,但你必须手动编写[ComImport]接口,就像你一样。

这些接口的声明存在于Windows SDK中的.h文件中。 大多数程序员在他们的机器上都有7.1版,具体取决于他们的VS版本,位于c:\ program files(x86)\ microsoft sdks \ windows \ v7.1a \ include。 因此,您可以执行的一项简单操作是使用VS中的编辑+查找和替换+在文件中查找菜单命令,并在目录中搜索“IFileDialog”。 流行音乐:

  MIDL_INTERFACE("42f85136-db7e-439c-85f1-e4075d135fc8") IFileDialog : public IModalWindow // etc... } 

为什么它inheritance自IModalWindow而不是IUnknown而你从未在C#声明中提及它是另一天的故事:)