【发布时间】:2013-10-09 19:45:13
【问题描述】:
(注意:名称和 GUID 已从原始值更改)
在调试应用程序时,我发现我的错误的罪魁祸首可能是我的应用程序链接的库中的函数
pAgent->raw_Open()
agent 在我们的 C++ 代码中声明为
XX::IAgentPtr pAgent
Visual Studio 能告诉我的关于 IAgentPtr 的所有信息就是它的类型是
_com_ptr_t<_com_IIID<XX::IAgent,&_GUID_deadbeef_1234_1234_1234_1234deadbeef> >
而且我的调试器无法进入agent->raw_Open() 的代码以查看发生了什么。我想知道是哪个 DLL 定义了XX:IAgent,因为我可能能够获得该 DLL 的调试信息或源代码。
我发现IAgent是一个COM接口,通过在别处搜索,我发现我可以通过查看注册表找到DLL文件的位置(HKEY_CLASSES_ROOT\CLSID\{guid} )。但是,我在那里找不到我正在寻找的 GUID。
如果我知道 IAgent 的 GUID,我如何找到包含 IAgent 定义的 DLL?
(注意:虽然它们的标题相似,但这个问题不是 this question 的重复问题,因为链接问题的提问者知道定义 GUID 接口的 DLL)
【问题讨论】:
-
看向源代码文件的顶部,那里应该有一个#import 指令。这至少应该缩小您使用的 COM 组件类型。我们无法帮助您找到 DLL 或代码的所有者。
-
是否有一种简单的方法或实用程序来查找文件#imported 的所有文件、#includes 文件、#included 文件#included 文件等?此外,我能够找到仅给出 GUID 的 DLL(并且知道哪个目录可能包含 DLL 只会让它更快;我可以搜索整个硬盘驱动器。)
-
错误的心理形象。它导入一个 类型库 并从中自动生成 C++ 声明。构建后,您将在构建目录中找到 .tli 和 .tlh 文件。您可以使用文本编辑器查看它们。真正了解这里发生了什么需要了解 COM 自动化的工作原理。
-
好吧,如果我的理解正确,你是否暗示一般来说,知道哪个 DLL 具有某些定义并不比知道哪个导入的类型库包含某些符号有用,所以我应该寻找类型库而不是 DLL?或者,与找到 TLB 相比,找到 DLL 已经足够困难了,而花在寻找 TLB 上的努力会更好?
-
当然,如果您想使用 DLL,那么您需要声明该 DLL 中的函数。类型库提供这些声明。它通常作为资源嵌入在 DLL 中,有时它作为单独的 .tlb 文件提供。在您运行程序之前,实际的 DLL 不会起作用。
标签: com