显式加载库的干净方法
clean way to explicitly load library
我正在寻找一种明确加载库的干净方法。大多数情况下,我有一个 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 对隐式加载库一样。
事实上,有一种方法可以获得所有隐式链接的便利性,同时仍然能够优雅地处理库加载和符号查找失败。Visual Studio 为延迟加载的 DLL 提供链接器支持,使用户代码能够挂钩到加载器,并为不可用的符号实现任意恢复策略(例如,通过返回无操作存根)。这样就可以将所有故障处理整合到一个地方。
为你需要的外部函数编写一个纯接口。(取决于平台)
提供实现类(适用于您的平台)。对于 Windows 实现加载 DLL,请首先获取过程地址。
比起需要调用接口函数时,类将调用路由到加载的 DLL 中。
对其他平台使用类似的方法。
这无非是使用延迟加载的 DLL。这只是一个手动解决方案。但是使用接口的方法允许您获得真正的平台相关解决方案。
相关文章:
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- 使用元素加载 std::queue<uint8_t*> 的更有效方法?
- 通过重新加载DLL,避免使用DLL预加载漏洞,任何更好的方法
- Java加载DLL,该DLL从JNI中的另一个DLL导出方法
- 一种在没有 root 的情况下加载共享库的更简单方法
- 显式加载库的干净方法
- 如何将参数传递给从 CPP 中的静态库加载的方法
- 从C++模拟中保存和加载数据的有效方法
- 有没有一种方法可以在编译时加载到omp.h中,因此机器永远不需要在运行时获取它
- 加载动态链接库的第三种方法?大头针
- 通过JNI调用System.loadLibrary()不会加载本机方法
- 在文件中存储已知最大长度的字符串以快速加载到C++矢量的最佳方法<string>
- 只有当类重写方法时,在动态加载的共享库中实例化的类才会丢失XCode 4.3/4.4 typeinfo
- QtGUI:加载二进制像素图的最快方法是什么
- 在Android中,如何在jni_onLoad方法中加载其他共享库
- 如果模板化"ResourceCache"需要不同的创建参数/方法,它们如何加载/创建 T 类型的资源?
- QT是否有其他方法可以在没有QTNetworkManager的情况下加载图像
- 加载QPixmap数据的更好方法
- ctypes 自己的库加载,但无法访问函数/方法
- 在为 iOS 编译时通过 Makefile 加载 libxml 的正确方法