c# - C# 中的 ComImport,如何找到 shell32.dll 中 IFileDialog 等类的 GUID?

标签 c# .net com guid

我一直在尝试使用 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 的接口(interface)中识别它们。

它们很简单,最重要的是因为它们支持类型库。这是服务器支持的接口(interface)的独立于语言的描述,包括它们的 guid。类型库就像 .NET 中的元数据。并且以相同的方式使用,编译器可以读取它并知道如何对您的代码执行类型检查并提供自动完成。 Shell32.dll 有一个,它作为资源嵌入到 DLL 中。它非常有限,仅旨在让脚本语言访问某些 shell 功能。

然后是“硬”类型。您通常可以从它们继承自 IUnknown 的接口(interface)中识别它们。它们仅在 C++ 中易于使用,没有适用于它们的类型库,您也无法创建类型库,因为它们倾向于使用与自动化不兼容的类型。 Windows 的主要部分只能用于此类界面,shell 和 DirectX 是最著名的例子。您可以在 C# 中使用它们,但您必须像以前一样手动编写 [ComImport] 接口(interface)。

这些接口(interface)的声明存在于 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...
  }

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

关于c# - C# 中的 ComImport,如何找到 shell32.dll 中 IFileDialog 等类的 GUID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24188007/

相关文章:

c# - 我们应该为新项目选择 Java 而不是 C# 吗?

c# - C# 4.0 的新功能 - "Optional Parameters"CLS 兼容吗?

c# - 非委托(delegate)类型的事件

c# lambda 表达式 - 将委托(delegate)结果添加到通用列表

c# - Entity Framework 连接字符串 "The Server was not found"

c# - 如何将文件路径从我的代码中取出并放入 mysql 的插入语句中?

C# 展平具有列表属性的对象列表

com - 如何从 OCX 或 TLB 文件中获取导入的类型库?

python - 通过 CPython/pywin32 使用 Windows UI 自动化?

windows - 在64位注册表部分注册32位本地服务器是对还是错?