1
1
当对象在同一单元的proc(即从dll)中加载时,您可能会使用一些技巧在内存中查找dll。例如,如果在虚拟方法表(vtable)中查找活动对象中的代码指针,它们通常会指向dll。然后,您可以使用一些系统调用来确定代码属于哪个加载的DLL。 但有许多潜在的陷阱。如果必须将这些对象加载到单独的单元中,那么代码指针将指向存根,而不是实际的代码。此外,许多COM库实际上在运行时提供的包装类中实现了公共接口,因此在许多常见的用例中,这极有可能给您提供错误的信息。(即,您最终将获得运行时dll的信息,通常是MFC或ATL)。 当一个对象在进程外加载(即从一个exe加载)时,我不知道任何合理的方法来追查哪个exe对应于活动对象。(显然,此数据必须存在于进程或COM运行时的某个位置,但它隐藏在存根的下面,并且可能取决于正在运行的Windows版本)。 因此,除非您查看的是一组非常有限的对象(所有正在处理的对象都加载在与您相同的单元中),否则您最好的选择是使用注册表中的注册信息来查找所需的内容。这很麻烦,因为这是一个可以从操作系统的版本改变到版本的东西,但幸运的是,COM已经存在了足够长的时间,这些年来它并没有改变太多。 给定从中获取的对象的clsid Component Categories Manager ,您将按如下方式查找相应的二进制文件:
|
2
0
获取这些信息的一种方法,假设它仅用于日志记录目的,就是简单地等待所有初始化完成,然后枚举加载的模块,将每个模块的详细信息转储到日志文件中。 显然,这只适用于inproc对象,如果应用程序非常动态,它将不起作用,但它也会捕获非COM DLL。 |
Cleric · C#运行主动自动化对象-如何源事件? 6 年前 |
Daniël J · 使用GUI制作COM服务器的最佳实践是什么? 6 年前 |
Toponimo · 从Python访问COM方法 6 年前 |
user8666372 · 自动向可用引用添加引用 6 年前 |