【发布时间】:2013-08-03 03:55:51
【问题描述】:
我觉得有一种比在 typedef 中包含数百个签名然后通过 GetProcAddress 加载指针更好的方法。据我所知,在加载 DLL 函数时,它是最简单的——但也很脏。
有没有更简单的加载 DLL 函数的方法?具体来说,大量的Winapi和Tool Help库函数?我知道你可以只“包含一个 .lib”,但我觉得这会导致不必要的膨胀;我也无法访问源代码(尽管 Jason C 提到可以从 .dll 转到 .lib)。
我正在寻找为此编写一个库。我觉得主要的障碍是处理具有不同签名的函数。或者这正是为什么每个人都使用 typedef 而不是“一些奇特的循环”来加载他们的 DLL 函数的原因?
【问题讨论】:
-
使用
GetProcAddress的唯一原因是如果您需要在运行时决定要加载哪个库(即,如果您有多个选择、插件,或者如果库不能保证存在) .否则,您应该使用.lib并让系统负责库加载和链接。 -
@Saustin 是什么让你说导入库会导致不必要的膨胀?它只是一个帮助链接器将导出符号修复为 dll 的存根。如果没有目标文件引用它们,链接器将不会引入不必要的符号。
-
所以您正在加载 Windows API 函数?为什么不像其他人一样将它们与 .lib 链接?函数签名已经在
Windows.h! -
这很奇怪。我的意思是,您确实需要明确加载相当多的 Windows API 函数,但是我可以找到的对 CreateTool32Snapshot 的每个引用都表明它是在 kernel32.lib 中定义并在 tlhelp32.h 中声明的,并且从 XP 到支持8. 我从未使用过 CreateTool32Snapshot,所以我不确定,但根据我的经验,微软在描述此类特殊注意事项时通常是准确的。
-
我应该补充一点,CreateTool32Snapshot 不存在.. 这是一个我严重忽略的错字。 CreateToolhelp32Snapshot 是正确的 API。此外,必须在 Windows.h 之后声明 TlHelp32.h。提醒自己:下次去睡觉。