Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何找到用给定GUID定义COM对象或接口的二进制文件?_Com - Fatal编程技术网

如何找到用给定GUID定义COM对象或接口的二进制文件?

如何找到用给定GUID定义COM对象或接口的二进制文件?,com,Com,(注意:名称和GUID已从原始值更改) 在调试一个应用程序时,我发现我的一个bug的罪魁祸首可能是在我的应用程序链接的库中,在函数中 pAgent->raw_Open() < > >代码>代理>代码>在我们的C++代码中声明为 XX::IAgentPtr pAgent VisualStudio能告诉我的关于IAgentPtr的所有信息是它的类型是 _com_ptr_t<_com_IIID<XX::IAgent,&_GUID_deadbeef_1234_1234_12

(注意:名称和GUID已从原始值更改)

在调试一个应用程序时,我发现我的一个bug的罪魁祸首可能是在我的应用程序链接的库中,在函数中

pAgent->raw_Open()
< > >代码>代理>代码>在我们的C++代码中声明为

XX::IAgentPtr pAgent
VisualStudio能告诉我的关于IAgentPtr的所有信息是它的类型是

_com_ptr_t<_com_IIID<XX::IAgent,&_GUID_deadbeef_1234_1234_1234_1234deadbeef> >
\u com\u ptr\t
我的调试器无法进入
agent->raw\u Open()
的代码中查看发生了什么。我想知道哪个DLL定义了
XX:IAgent
,因为我可以获得该DLL的调试信息或源代码

我发现,
IAgent
是一个COM接口,通过在其他地方搜索,我发现我可以通过在注册表中查找(HKEY_CLASSES\u ROOT\CLSID\{guid})来找到DLL文件的位置。但是,我在那里找不到要查找的GUID

如果我知道
IAgent
的GUID,如何找到包含
IAgent
定义的DLL


(注意:尽管他们有相似的标题,但这个问题不是重复的,因为链接问题的提问者知道定义GUID接口的DLL)

一个可以搜索二进制文件以查找纯文本数据的程序可以工作

我使用Windows Grep搜索了所有DLL文件中的“deadbeef-1234-1234-1234-1234deadbeef”,找到了定义了
IAgent
的DLL


但是,有一种更好的方法可以找到这些信息。HKEY\U CLASSES\U ROOT\CLSID\具有对象的子键,但IAgent是一个接口。如果您知道接口的GUID,可以在HKEY_CLASSES_ROOT\interface\{GUID}中查找。在那里,如果您找到一个键
TypeLib
,则默认值是一个GUID,您可以在HKEY_CLASSES\u ROOT\TypeLib中找到该GUID,并且可以从中找到dll的路径。如果没有,则名为
ProxyStubClsid
ProxyStubClsid32
的键中的默认值是可以在HKEY_CLASSES\u ROOT\CLSID中找到的GUID。

查看源代码文件的顶部,那里应该有一个#import指令。这至少应该缩小您正在使用的COM组件的范围。我们无法以其他方式帮助您找到DLL或代码所有者。是否有一种简单的方法或实用程序来查找所有文件(由文件导入、包含的文件、由包含的文件包含的文件等)?此外,我能够在只给定GUID的情况下找到DLL(并且知道哪个目录可能包含DLL使它更快;我可以搜索整个硬盘。)错误的心智映像。它导入一个类型库并自动从中生成C++声明。生成后,您将在build目录中找到.tli和.tlh文件。您可以使用文本编辑器查看它们。真正理解这里的情况需要理解COM自动化是如何工作的。好吧,如果我理解正确的话,你是在暗示,一般来说,知道哪个DLL有特定的定义并不比知道哪个导入的类型库包含特定的符号更有用,所以我应该找类型库而不是DLL?或者说,与查找TLB相比,查找DLL已经足够困难了,那么查找TLB的工作会更好吗?当然,如果要使用DLL,则需要声明该DLL中的函数。类型库提供了这些声明。它通常作为资源嵌入到DLL中,有时作为单独的.tlb文件提供。在运行程序之前,实际的DLL不会起作用。