Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ComImport在C#中,如何在shell32.dll中找到像IFileDialog这样的类的GUID?_C#_.net_Com_Guid - Fatal编程技术网

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

ComImport在C#中,如何在shell32.dll中找到像IFileDialog这样的类的GUID?,c#,.net,com,guid,C#,.net,Com,Guid,我一直在尝试使用ComImport为我正在编写的C#应用程序在各种DLL中设置一些win32类的互操作。我不明白的是如何找到类的GUID?我找到了一些有效的导入示例,但我不确定作者是如何找到类的GUID的。下面列出了导入IFileDialog及其方法之一的示例 [ComImport(), Guid("42F85136-DB7E-439C-85F1-E4075D135FC8"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] intern

我一直在尝试使用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版本4的扩展模型。非常成功,实际上Windows上的任何语言运行库都支持它。您通常从继承自
IDispatch
的接口识别它们

最简单的是,它们支持类型库。它是服务器支持的接口的独立于语言的描述,包括它们的guid。类型库就像.NET中的元数据一样。使用同样的方法,编译器可以读取它,知道如何对代码执行类型检查并提供自动完成。Shell32.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中的Edit+Find and Replace+Find in Files菜单命令,并在目录中搜索“IFileDialog”。持久性有机污染物:

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

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

太棒了!这完美地回答了我的问题。我在v7.0A文件夹的快速grep中找到了相同的内容;它存在于SHOBIDIDL.H中,在C++程序中通常包含IfLeDeLax的相同标题。奇怪的是,它是IModalWindow而不是你提到的IUnknown。我是一个长期从事linux c/c++和工程/科学计算原型语言的人。C#、Windows programming.NET、CLR等中的托管代码需要一些时间才能适应。谢谢我正在使用windows 7 x86和visual studio 2015。但是找不到任何.h文件。在program files/microsoft SDK/windows中,有4个文件夹v7.0a v8.0a v8.1a和v10.0a。在这两个目录中,只有一个bin目录。没有包含目录。它已被移动,请单击“提问”按钮。您的意思是我必须创建一个新问题?