我应该使用GetProcAddress还是只包含各种win32库?

时间:2009-01-29 21:12:35

标签: c++ c winapi

想知道之间有什么区别:

static PROCESSWALK pProcess32First=(PROCESSWALK)GetProcAddress(hKernel,"Process32First");
...
pProcess32First(...);

什么是hKernel?查看here。您可以使用GetModuleHandle()

替换

#include <Tlhelp32.h>
...
Process32First(...);

有什么区别,我想知道应该使用哪些。那么最佳实践方面有什么不同吗?

4 个答案:

答案 0 :(得分:7)

注意:我的回答是假设该功能可用,无论您是在非导出功能之后还有其他需要考虑的事项。

如果使用LoadLibrary和GetProcAddress,那么如果不存在所需的库,则可以选择以减少的功能运行该选项。如果您使用include并直接链接lib,并且dll不存在(或者由于版本错误而没有导出),您的应用程序将无法加载。

如果你想使用一个不在给定dll的所有版本中的函数,那真的只会有所不同。

答案 1 :(得分:2)

有关Microsoft的解释,请参阅here

隐式链接(使用*.lib)更简单。

对于内核库,没有其他区别。

答案 2 :(得分:2)

如果我有用户可能拥有或不拥有的可选插件库,我会采用第一种方法。对于必要的库,我会使用第二个,因为获取函数的代码要少得多。

答案 3 :(得分:2)

除了Evan所说的(这是正确的)之外,另一个重要的区别(IMHO)是,如果你动态加载函数,你需要有一个typedef来转换void *以便调用函数一次它装了。除非定义静态链接的函数原型的头文件具有一种机制,用于从同一模板函数定义代码定义函数指针的typedef,否则您最终可能会在代码中找到重复的函数定义。如果外部头定义被更新(例如,使用64位数据类型的新定义),则除非更新其他函数原型(这些将在编译时不会被捕获,因为c-样式转换为函数typedef)。

这是一个微妙的问题,但是需要考虑的重要问题。如果可以的话,我会使用隐式(“静态”)链接,如果你正在使用动态加载,请注意问题,并构建代码以避免将来出现问题。