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

时间:2015-05-08 18:06:34

标签: c++ pointers winapi dll getprocaddress

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

当你完成后,你至少应该调用SymCleanup让符号管理器库关闭,释放它所持有的任何内存等等。据推测,当你的进程结束时会发生这种情况,但是当你完成后调用它会更干净。

如果你有调试信息,几乎任何符号都会成功。但是,即使没有调试信息,它也会(至少通常)成功导出符号。