COM如何工作?

时间:2015-11-09 23:32:10

标签: c# windows com clr

我有一个据称是COM对象的DLL。我试图了解当dll中没有可用的导出功能时,CLR能够确定调用哪个函数的确切方式(我使用depends检查)。

  [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指针被传递等等。

这有什么神奇之处?

1 个答案:

答案 0 :(得分:3)

从(非托管)代码,可以在"类型库"上使用LoadTypeLib / LoadTypeLibEx。与COM对象关联的文件。通常,这是为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个网址,但可以查找https - // msdn.microsoft.com/en-us/library/d0kh9f4c.aspx。

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