代码之家  ›  专栏  ›  技术社区  ›  Ibrahim Najjar

COM到.NET互操作性

  •  1
  • Ibrahim Najjar  · 技术社区  · 14 年前

    如果要在 C.* 代码,过程是直接的,对吗?您只需要使用类型库导入器,这很好,但是如果您没有类型库导入器,并且无法查看 IDL 文件?您只有COM DLL服务器。

    例如,尝试使用 IActiveDesktop 接口。

    解决这类问题的方法是什么?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Hans Passant    14 年前

    有两种COM接口。您熟悉的是那些将自己限制在被称为“OLE自动化”的COM规范的一个子集的规范。在这个术语与安全灾难联系起来之前,也被称为ActiveX。

    自动化兼容接口几乎可以从任何语言中使用。它们通常继承自IDispatch,允许从脚本语言使用它们。并且限制自己只使用自动化兼容的类型作为方法参数。与.NET值类型、字符串的bstr、数组的safearray、非类型化参数的variant比较,这些简单的东西与.NET的system.object非常相似。

    他们很好支持的另一个特性是类型库,相当于.NET元数据。编译器用来知道如何调用接口方法。IDE使用类型库自动生成互操作库,这样您就可以直接创建包装类并从.NET代码调用方法。

    好吧,这是好消息。坏消息是周围有很多COM接口不使用自动化限制。它们通常从iunknown继承,并使用不好封送的函数参数。类似结构。窗口中一个非常大且可见的组件就是shell。Windows资源管理器。

    这也是iaactivedesktop适合的地方,它是一个shell接口,从iunknown继承。它在shlobj.h sdk头文件中声明,甚至没有IDL文件。因此,没有办法用它的定义来获取类型库。它使用不兼容的参数类型,如lpcwstr(指向字符串的原始指针)而不是bstr。以及结构指针,如lpccomponent和lpwallpaperopt。clr interop支持无法正确封送。

    在C中使用接口在技术上并非不可能,但您必须重新声明接口。非常小心,弄错很容易。事实上,已经这样做的源代码很难找到,这暗示了它有多困难。这完全属于“不可能,但理智的程序员想要维护这样的代码”类别。shell是非托管C++代码的域。以及一组精力充沛的程序员,因为调试shell扩展是非常痛苦的。