C++ 显式加载库的干净方法

C++ 显式加载库的干净方法,c++,winapi,loadlibrary,getprocaddress,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 ?

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

确实有一种方法可以获得所有隐式链接便利,同时仍然能够优雅地处理库加载和符号查找失败。VisualStudio提供了这样的功能,用户代码可以钩住加载程序,并为不可用的符号实施任意恢复策略(例如,通过返回无操作存根)。这使得将所有故障处理整合到一个地方成为可能。

为所需的外部功能编写一个纯接口。(取决于平台)

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

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

对其他平台使用类似的方法


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

您可以在一个位置调用一次
LoadLibrary
,然后多次调用
GetProcAddress
,以获取所有函数指针并使用它。您还可以为该DLL实现延迟加载。这是编程101。创建一个函数或类,为您包装这个功能,并屏蔽您的细节。您还可以看看其中提供了一些抽象。我自己还没有用过,但是看起来很干净。我目前也在使用延迟加载。我的目标是拥有一个更独立于平台的选项。我知道load library和GetProcAddress也依赖于平台,因此我需要一个单独的模块来处理所有这些“加载内容”,以便将来可以轻松修改模块。@RonaldKu:模块加载本质上依赖于平台。但是,您可以提供独立于平台的接口,例如,通过返回不可用符号的
nullptr
。或
std::可选的
,并与无操作存根指针一起使用。如果时间允许的话,我会看看是否可以设计一些示例代码来说明这个概念。