我一直在尝试使用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,然后编写上面列出的方法导入?
答案 0 :(得分:7)
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中的编辑+查找和替换+在文件中查找菜单命令,并在目录中搜索“IFileDialog”。流行音乐:
MIDL_INTERFACE("42f85136-db7e-439c-85f1-e4075d135fc8")
IFileDialog : public IModalWindow
// etc...
}
为什么它继承自IModalWindow而非IUnknown而你从未在C#声明中提及它是另一天的故事:)