COM是如何工作的

本文关键字:工作 何工作 COM | 更新日期: 2023-09-27 18:21:13

我有一个据称是COM对象的dll。我试图了解CLR是如何在dll中没有可用的导出函数时(我使用dependent进行了检查)确定要调用哪个函数的。

  [Guid("DEADBEEF....")]
  [TypeLibType(...)]
  [ComImport]
  public interface ISomething
  {
    [DispId(1)]
    [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
    [return: MarshalAs(UnmanagedType.IDispatch)]
    object DoSomething([MarshalAs(UnmanagedType.IDispatch), In] object something);

}

在这里,我检查了MSIL,没有关于它所在的地址、函数名或偏移量的信息。

此外,似乎没有关于对象如何布局以便传递其vtable指针的信息,等等。

这是什么魔法?

COM是如何工作的

从(非托管)代码中,可以在与COM对象关联的"类型库"文件上使用LoadTypeLib/LoadTypeLibEx。通常,这是为COM对象本身注册的EXE或DLL(但它也可以是独立的TLB文件、外部类型库等)。LoadTypeLib的文档在https://msdn.microsoft.com/en-us/library/windows/desktop/ms221027(v=vs.85).aspx.

一旦获得ITypeLib/ITypeLib2类型库接口,它将提供所有COM对象信息,包括接口、vtable布局、原型等。完整文档位于https://msdn.microsoft.com/en-us/library/windows/desktop/ms221549(v=vs.85).aspx.

LoadTypeLib的一个例子是大多数版本的Visual Studio提供的OLE/COM对象查看器,它基本上可以将给定的类型库反编译回IDL。我不能发布超过2个URL,但请查找https://msdn.microsoft.com/en-us/library/dokh9f4c.aspx.

在托管代码中,编译器透明地导入类型库,尽管在幕后它所做的工作基本上与OLE/COM查看器相同,还添加了必要的托管包装器。有关详细信息,请参阅https://msdn.microsoft.com/en-us/library/xwzy44e4(v=vs.110).aspx。