【问题标题】:ComImport in C#, how do you find GUID for classes like IFileDialog in shell32.dll?C# 中的 ComImport,如何在 shell32.dll 中找到 IFileDialog 等类的 GUID?
【发布时间】:2014-08-02 23:47:24
【问题描述】:

我一直在尝试使用 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,然后编写上面列出的方法导入?

【问题讨论】:

    标签: c# .net com guid


    【解决方案1】:

    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 sdks\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 中发现了同样的情况;它出现在 ShObjIdl.h 中,我通常在 C++ 程序中包含相同的头文件以使用 IFileDialog。奇怪的是它是 IModalWindow 而不是你提到的 IUnknown 。我是长期从事 linux 人 c/c++ 和工程/科学计算的原型设计语言的人。 C#、Windows 编程 .NET、CLR 等中的托管代码需要一些时间来适应。谢谢!
    • 我正在使用 Windows 7 x86 和 Visual Studio 2015。但找不到任何 .h 文件。在程序文件/microsoft sdks/windows 中有 4 个文件夹 v7.0a v8.0a v8.1a 和 v10.0a。在它们内部只有一个 bin 目录。没有包含目录。
    • 它被移动了,点击按钮。
    • 你的意思是我必须创建一个新问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2022-06-13
    相关资源
    最近更新 更多