其他分享
首页 > 其他分享> > 获取COM-Object的DLL文件,而不使用c中的CLSID和注册表

获取COM-Object的DLL文件,而不使用c中的CLSID和注册表

作者:互联网

是否可以在不使用CLSID和注册表查找的情况下获取加载的COM-Object的DLL-filename?

我有一个IUnknown或者我的情况下是一个IBaseFilter接口指针,现在我想得到创建这个COM-Object的DLL-filename.我可以使用对象点地址反向查找已创建它的已加载模块吗?然后让HMODULE在GetModuleFileName中使用它.

解决方法:

自然只使用一些黑客.对象本身位于堆上,它是共享的,但是你可以看到它的虚拟表所在的位置 – 它应该几乎普遍存在于创建者二进制文件的只读数据部分中.

因此,在对象中加载第一个指针,就像虚拟表指针驻留在Windows COM ABI中一样:

IBaseFilter* pFilter = ...;
char* vtbl = *reinterpret_cast<char**>(pFilter);

然后我最初建议用EnumProcessModules()做一些马戏团,例如here,在每个模块上调用GetModuleInformation()并检查vtbl指针是否落入其内存范围.愚蠢的我,我忘了VirtualQueryEx(),所以罗马在他的回答中描述的更好.

当然,所有这些只能用于进程内COM对象以及不涉及代理的情况.我认为它仍然可以在你的DirectShow案例中有用.

另请参阅有关使用IPersist :: GetClassId()和注册表查找的注释,它应该适用于大多数DirectShow过滤器.

标签:c,dll,com,directshow
来源: https://codeday.me/bug/20190830/1770962.html