【问题标题】:Get name of object imported from DLL获取从 DLL 导入的对象的名称
【发布时间】:2015-05-08 18:06:34
【问题描述】:

我有一个指向使用 GetProcAddress 从 DLL 加载的某个对象的指针:

CSomeClass* pSomeClass;
pSomeClass = (CSomeClass*)GetProcAddress(someDLLinstance, "SomeUnknownName");

我无法修改上面的代码,但是我需要在它超出范围后获取"SomeUnknownName"字符串。我只能访问pSomeClass 指针。有什么方便的方法可以从指针中获取导入对象的名称吗?现在我只是从 DLL 中转储所有导出名称,然后在它们每个上使用 GetProcAddress() 以获取指向所有导出对象/函数的所有指针,然后将 pSomeClass 与这些指针进行比较,但这似乎很慢一个解决方案。

【问题讨论】:

  • 通过"SomeUnknownName"查找实际上是什么意思??
  • GetProcAddress 不返回对象。它返回一个过程地址。 pSomeClass 没有关于 SomeUnknownName 是什么的信息;它只是一个指针。一旦字符串 SomeUnknownName 超出范围,就无法将其取回,除非完全按照您的操作 - 对每个导出的名称调用 GetProcAddress,直到找到匹配的地址。
  • GetProcAddress 不返回对象本身,但它可能返回对象指针以及函数指针。我只是假设它会查找一些表来找到给定名称的指针。我想要的是,找到给定指针的名称,反之亦然。
  • 对象没有名字。你的问题仍然模糊不清,
  • 出口有名字。考虑 DLL 中的这些行:extern "C" __declspec(dllexport) CSomeClass firstInstance; extern "C" __declspec(dllexport) CSomeClass secondInstance; 然后,我可以获得指向任一对象的指针:pSomeClass = (CSomeClass*)GetProcAddress(someDLLinstance, "firstInstance");

标签: c++ pointers winapi dll getprocaddress


【解决方案1】:

如果您确实需要这样做,您可以使用 DbgHelp 函数来完成这项工作。具体来说,在这种情况下,您将查看 SymFromAddr

您首先调用SymInitialize,然后您可以调用SymFromAddr。你给它一个 SYMBOL_INFO 结构的地址。您填写地址和最大符号长度,它会返回名称。

当你完成后,你至少应该调用SymCleanup 让符号管理器库关闭,释放它所持有的任何内存等。大概当你的进程结束时会/将会发生,但是完成后调用它更简洁。

如果您有调试信息,那么几乎所有符号都会成功。然而,即使没有调试信息,它也会(至少通常)成功导出符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2011-01-02
    相关资源
    最近更新 更多