首页 > 解决方案 > 运行时加载同一目录(不是应用程序目录)中的 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 加载器和库系统不是很熟悉。

标签: windowswinapidll

解决方案


在 Windows 中执行此操作的一种方法是:

  • 当它被加载时保存HMODULElibembed.dll它作为第一个参数传递给它的DllMain入口点

  • 稍后,在准备加载其他 DLL 时,使用GetModuleFileNamesaveHMODULE获取完整路径libembed.dll

  • libembed.dll文件名从完整路径中拆分出来,例如使用PathRemoveFileSpecAPI 或_splitpathCRT 函数;

  • 将生成的目录路径与libcocotb.dll文件名结合起来,构建另一个 DLL 的完整路径,例如使用PathCombine_makepath;

  • 使用DLLlibcocotb.dll的完整路径。LoadLibrary


推荐阅读