【问题标题】:How can I find the binary which defines a COM object or interface with a given GUID?如何找到定义具有给定 GUID 的 COM 对象或接口的二进制文件?
【发布时间】: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-&gt;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


【解决方案1】:

可以搜索二进制文件以查找纯文本数据的程序将起作用。

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

但是,有更好的方法可以找到此信息。 HKEY_CLASSES_ROOT\CLSID\ 有 objects 的子键,但 IAgent 是一个接口。如果您知道接口的 GUID,您可以查看 HKEY_CLASSES_ROOT\Interface\{guid}。在那里,如果您找到一个键 TypeLib,则默认值是您可以在 HKEY_CLASSES_ROOT\TypeLib 中找到的 GUID,并且您可以从那里找到 dll 的路径。如果不存在,则名为 ProxyStubClsidProxyStubClsid32 的键中的默认值是可以在 HKEY_CLASSES_ROOT\CLSID 中找到的 GUID。

【讨论】:

    猜你喜欢
    • 2017-11-25
    • 1970-01-01
    • 2021-03-26
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 2013-10-04
    相关资源
    最近更新 更多