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对象关联的"类型库"文件上使用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。