运行时在同一目录(不是应用程序目录)中加载 DLL
Runtime-load A DLL In The Same Directory (Not The Application Directory)
我遇到这样一种情况,我需要在运行时(使用 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 中执行此操作的一种方法是:
在加载时保存 libembed.dll
的 HMODULE
,它作为第一个参数传递给它的 DllMain
entry point;
稍后准备加载其他DLL时,使用GetModuleFileName
和保存的HMODULE
得到完整路径libembed.dll
;
将 libembed.dll
文件名从完整路径中分离出来,例如使用 PathRemoveFileSpec
API or the _splitpath
CRT 函数;
将生成的目录路径与 libcocotb.dll
文件名组合以构建另一个 DLL 的完整路径,例如使用 PathCombine
or _makepath
;
使用 libcocotb.dll
到 LoadLibrary
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 中执行此操作的一种方法是:
在加载时保存
libembed.dll
的HMODULE
,它作为第一个参数传递给它的DllMain
entry point;稍后准备加载其他DLL时,使用
GetModuleFileName
和保存的HMODULE
得到完整路径libembed.dll
;将
libembed.dll
文件名从完整路径中分离出来,例如使用PathRemoveFileSpec
API or the_splitpath
CRT 函数;将生成的目录路径与
libcocotb.dll
文件名组合以构建另一个 DLL 的完整路径,例如使用PathCombine
or_makepath
;使用
libcocotb.dll
到LoadLibrary
DLL 的完整路径。