想知道之间有什么区别:
static PROCESSWALK pProcess32First=(PROCESSWALK)GetProcAddress(hKernel,"Process32First");
...
pProcess32First(...);
什么是hKernel?查看here。您可以使用GetModuleHandle()
和
#include <Tlhelp32.h>
...
Process32First(...);
有什么区别,我想知道应该使用哪些。那么最佳实践方面有什么不同吗?
答案 0 :(得分:7)
注意:我的回答是假设该功能可用,无论您是在非导出功能之后还有其他需要考虑的事项。
如果使用LoadLibrary和GetProcAddress,那么如果不存在所需的库,则可以选择以减少的功能运行该选项。如果您使用include并直接链接lib,并且dll不存在(或者由于版本错误而没有导出),您的应用程序将无法加载。
如果你想使用一个不在给定dll的所有版本中的函数,那真的只会有所不同。
答案 1 :(得分:2)
答案 2 :(得分:2)
如果我有用户可能拥有或不拥有的可选插件库,我会采用第一种方法。对于必要的库,我会使用第二个,因为获取函数的代码要少得多。
答案 3 :(得分:2)
除了Evan所说的(这是正确的)之外,另一个重要的区别(IMHO)是,如果你动态加载函数,你需要有一个typedef来转换void *以便调用函数一次它装了。除非定义静态链接的函数原型的头文件具有一种机制,用于从同一模板函数定义代码定义函数指针的typedef,否则您最终可能会在代码中找到重复的函数定义。如果外部头定义被更新(例如,使用64位数据类型的新定义),则除非更新其他函数原型(这些将在编译时不会被捕获,因为c-样式转换为函数typedef)。
这是一个微妙的问题,但是需要考虑的重要问题。如果可以的话,我会使用隐式(“静态”)链接,如果你正在使用动态加载,请注意问题,并构建代码以避免将来出现问题。