是否显示已加载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
}其中大括号内的字符串是要查找的对象的CLSIDREG_SZ
包含所需DLL的完整路径REG_SZ
包含您所需的EXE的完整路径。在某些情况下,您可能需要修剪命令行开关以关闭此字符串以仅获取EXE路径假设此信息仅用于日志记录,获取此信息的一种方法是等待所有初始化完成,然后枚举加载的模块,将每个模块的详细信息转储到日志文件中 显然,这只适用于inproc对象,如果应用程序非常动态,它将不起作用,但它也会捕获非COM DLL