2

我正在寻找一种明确加载库的干净方法。大多数情况下,我有一个 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 对隐式加载库一样。

4

2 回答 2

2

事实上,有一种方法可以获得所有隐式链接的便利,同时仍然能够优雅地处理库加载和符号查找失败。Visual Studio为延迟加载的 DLL 提供链接器支持,使用户代码能够挂钩到加载器,并为不可用的符号实现任意恢复策略(例如,通过返回无操作存根)。这使得将所有故障处理合并到一个地方成为可能。

于 2017-10-26T09:43:27.683 回答
0

为您需要的外部函数编写一个纯接口。(取决于平台)

提供一个实现类(为您的平台)。对于您的 Windows 实现加载 DLL,首先获取过程地址。

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

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

这只不过是使用延迟加载的 DLL。这只是一个手动解决方案。但是使用接口的方法可以让您获得真正的平台相关解决方案。

于 2017-10-26T12:03:14.800 回答