获取从 DLL 导入的对象的名称

Get name of object imported from DLL

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

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

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

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

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

当你完成后,你至少应该调用 SymCleanup 让符号管理器库关闭,释放它持有的任何内存,等等。大概 would/will 都发生了当您的流程结束时,但在您完成时调用它更清晰。

如果您有调试信息,那么几乎任何符号都会成功。但是,即使没有调试信息,导出的符号也会(至少通常情况下)成功。