windows - 运行时加载同一目录(不是应用程序目录)中的 DLL
问题描述
我有一种情况,我需要在运行时(使用LoadLibrary
)从同一目录中存在的另一个 DLL(libembed.dll)加载一个 DLL(libcocotb.dll)。这些 DLL 与应用程序不在同一目录中。
> tree
.
├── ...
├── libcocotb.dll
└── libembed.dll
仅指定库名称LoadLibrary("libcocotb.dll")
,未找到该库。LoadLibrary(".\\libcocotb.dll")
,没有找到库。将目录添加到PATH
似乎是错误的答案,我需要在运行时确定目录的位置,因为二进制文件需要可重定位(它们最终会进入 Python 轮子)。
在 Linux 上,我可以只添加$ORIGIN
到加载 DLL 的 RPATH 中。Windows上没有类似的东西吗?我对 Windows 加载器和库系统不是很熟悉。
解决方案
在 Windows 中执行此操作的一种方法是:
当它被加载时保存
HMODULE
,libembed.dll
它作为第一个参数传递给它的DllMain
入口点;稍后,在准备加载其他 DLL 时,使用
GetModuleFileName
saveHMODULE
获取完整路径libembed.dll
;将
libembed.dll
文件名从完整路径中拆分出来,例如使用PathRemoveFileSpec
API 或_splitpath
CRT 函数;将生成的目录路径与
libcocotb.dll
文件名结合起来,构建另一个 DLL 的完整路径,例如使用PathCombine
或_makepath
;使用DLL
libcocotb.dll
的完整路径。LoadLibrary
推荐阅读
- javascript - 应该测试 MERN 堆栈应用程序的哪一部分?
- reactjs - 如何评估包含 Jsx Native 代码的字符串作为 Render() 中的代码?
- macos - 'crc setup -d virtualbox' - 驱动标志被忽略
- java - Choco-solver :在 intVar 的一部分上定义约束
- python - 如何检查元素是否显示在网站上?
- ios - 自动布局 UITableViewCells 覆盖底部
- regex - TCL 在列表中查找
- r - 清理数据以创建一致的变量命名
- google-apps-script - 相同的脚本在具有相同数据的不同位置执行不同
- javascript - 在 linux 上安装 typeorm 后得到“bash: typeorm: command not found”