我有一个据称是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指针被传递等等。
这有什么神奇之处?
答案 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。