c++ - Win32 API 枚举 dll 导出函数?

标签 c++ windows winapi dll

我发现了类似的问题,但没有找到我正在寻找的答案。所以这里是:

对于原生 Win32 dll,是否有 Win32 API 来枚举其导出函数名称?

最佳答案

dumpbin/exports 几乎是您想要的,但这是一个开发工具,而不是 Win32 API。

LoadLibraryEx DONT_RESOLVE_DLL_REFERENCES 被强烈警告不要使用,但恰好对这种特殊情况很有用——它完成了将 DLL 映射到内存的繁重工作(但您实际上不需要或不想使用library),这使您可以轻松阅读标题:LoadLibraryEx 返回的模块句柄正指向它。

#include <winnt.h>
HMODULE lib = LoadLibraryEx("library.dll", NULL, DONT_RESOLVE_DLL_REFERENCES);
assert(((PIMAGE_DOS_HEADER)lib)->e_magic == IMAGE_DOS_SIGNATURE);
PIMAGE_NT_HEADERS header = (PIMAGE_NT_HEADERS)((BYTE *)lib + ((PIMAGE_DOS_HEADER)lib)->e_lfanew);
assert(header->Signature == IMAGE_NT_SIGNATURE);
assert(header->OptionalHeader.NumberOfRvaAndSizes > 0);
PIMAGE_EXPORT_DIRECTORY exports = (PIMAGE_EXPORT_DIRECTORY)((BYTE *)lib + header->
    OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);
assert(exports->AddressOfNames != 0);
BYTE** names = (BYTE**)((int)lib + exports->AddressOfNames);
for (int i = 0; i < exports->NumberOfNames; i++)
    printf("Export: %s\n", (BYTE *)lib + (int)names[i]);

完全未经测试,但我认为它或多或少是正确的。 (著名的遗言。)

关于c++ - Win32 API 枚举 dll 导出函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1128150/

相关文章:

windows - 如何安装 DBD::优势

delphi - 如何从 Delphi 5 ActiveX dll 创建 MDI 子窗口,并将其嵌入到 Delphi XE MDI 父窗口中?

c - 为什么Windows中的BOOL是int类型?

javascript - 将对象+骨架从 blender 导出到 Threejs 并手动移动骨骼

linux - Linux 中的 cakephp 热插拔驱动程序是否与 Windows 中的设备禁用/启用功能相同?

windows - 好奇执行二进制

基于体系结构的 C# 结构行为

c++ - 在 WC_TABCONTROL 中渲染 OpenGL Canvas

C++ 切换访问冲突

c++ - 访问违规写入位置