干净的方式来显式加载库

时间:2017-10-26 08:28:10

标签: c++ winapi loadlibrary getprocaddress

我正在寻找一种明确加载库的简洁方法。大多数情况下,我有一个LIB和DLL对,所以LIB将处理所有"加载东西"我可以直接调用dll中的函数。明确地这样做时,我需要做以下几点:

HMODULE libA = LoadLibrary("dllA.dll"); // NULL if load failed
HMODULE libB = LoadLibrary("dllB.dll"); // NULL if load failed

void (*functionA)(void) = libA ? GetProcAddress(libA,"functionA"):NULL;
void (*functionB)(void) = libB ? GetProcAddress(libB,"functionB"):NULL;

当我需要在DLL中调用函数时,如果在我的代码中找到LoadLibrary()和GetProcAddress(),那将会很混乱。我想知道是否有一种干净的方式,以便我可以在1-2个文件中编写所有处理并调用函数,就像我通过LIB和DLL对隐式加载库一样。

2 个答案:

答案 0 :(得分:2)

确实有一种方法可以获得所有隐式链接的便利性,同时仍能够优雅地处理库加载以及符号查找失败。 Visual Studio提供Linker Support for Delay-Loaded DLLs,它使用户代码能够挂钩到加载器,并为不可用的符号实现任意恢复策略(例如,通过返回无操作的存根)。这样就可以将所有故障处理整合到一个地方。

答案 1 :(得分:0)

将纯接口写入所需的外部函数。 (取决于平台)

提供一个实现类(适用于您的平台)。对于Windows实现加载DLL,最初获取过程地址。

当需要调用接口函数时,该类将调用路由到加载的DLL中。

对其他平台使用类似的方式。

这只是使用延迟加载的DLL。这只是一个手动解决方案。但是使用接口的方法允许您使用真正的平台相关解决方案。