是否显示已加载COM对象的路径/版本信息?

是否显示已加载COM对象的路径/版本信息?,com,Com,我有一些代码使用组件类别管理器来加载实现特定类别的所有类 有没有一种简单的方法可以从加载的DLL或EXE中获取描述、路径和版本信息?当对象在同一单元的proc中加载(即从DLL中加载)时,您可以使用一些技巧在内存中查找DLL。例如,如果在虚拟方法表(vtable)中查找指向活动对象的代码指针,它们通常会指向DLL。然后,您可以使用一些系统调用来确定该代码属于哪个加载的DLL 但也有许多潜在的陷阱。如果必须将这些对象加载到单独的单元中,那么代码指针将指向存根,而不是实际的代码。此外,许多COM库实

我有一些代码使用组件类别管理器来加载实现特定类别的所有类


有没有一种简单的方法可以从加载的DLL或EXE中获取描述、路径和版本信息?

当对象在同一单元的proc中加载(即从DLL中加载)时,您可以使用一些技巧在内存中查找DLL。例如,如果在虚拟方法表(vtable)中查找指向活动对象的代码指针,它们通常会指向DLL。然后,您可以使用一些系统调用来确定该代码属于哪个加载的DLL

但也有许多潜在的陷阱。如果必须将这些对象加载到单独的单元中,那么代码指针将指向存根,而不是实际的代码。此外,许多COM库实际上在运行时提供的包装类中实现了公共接口,因此在许多常见用例中,这很可能会给您错误的信息。(即,您最终将获得运行时DLL的信息,通常是MFC或ATL)

当一个对象从proc中加载(即从一个EXE)时,我不知道有什么可行的方法来追踪哪个EXE对应于活动对象。(显然,这些数据必须存在于您的进程或COM运行时中的某个位置,但它隐藏在存根下面的某个位置,并且可能取决于您正在运行的Windows版本)

因此,除非您正在查看一组非常有限的对象(与您在同一单元中加载的所有对象都在proc中),否则您最好使用注册表中的注册信息来查找所需的对象。这很麻烦,因为这是一个可以在不同版本的操作系统之间改变的东西,但幸运的是COM已经存在了足够长的时间,多年来这一点没有改变太多

给定从获取的对象的CLSID,您将按如下方式查找相应的二进制文件:

  • 打开注册表项
    HKEY_CLASSES_ROOT\CLSID\{xxxxxxxxx-YYYY-zzzz-aaaa-BBBBBB
    }
    其中大括号内的字符串是要查找的对象的CLSID
  • 如果这是一个in-proc对象,则将有一个名为的子键,其“default”
    REG_SZ
    包含所需DLL的完整路径
  • 如果这是一个out-of-proc对象,将有一个名为的子键,其“default”
    REG_SZ
    包含您所需的EXE的完整路径。在某些情况下,您可能需要修剪命令行开关以关闭此字符串以仅获取EXE路径
  • 使用前面步骤中的DLL或EXE,您可以在Win32中调用(如果有.NET可用,则使用)从可执行文件中检索版本信息结构,其中将包含版本和说明

  • 假设此信息仅用于日志记录,获取此信息的一种方法是等待所有初始化完成,然后枚举加载的模块,将每个模块的详细信息转储到日志文件中

    显然,这只适用于inproc对象,如果应用程序非常动态,它将不起作用,但它也会捕获非COM DLL