运行时在同一目录(不是应用程序目录)中加载 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.dllHMODULE,它作为第一个参数传递给它的 DllMain entry point;

  • 稍后准备加载其他DLL时,使用GetModuleFileName和保存的HMODULE得到完整路径libembed.dll;

  • libembed.dll 文件名从完整路径中分离出来,例如使用 PathRemoveFileSpec API or the _splitpath CRT 函数;

  • 将生成的目录路径与 libcocotb.dll 文件名组合以构建另一个 DLL 的完整路径,例如使用 PathCombine or _makepath;

  • 使用 libcocotb.dllLoadLibrary DLL 的完整路径。