我有一个包含非托管 dll 的托管 c++/cli 项目。
我用 加载非托管 dll LoadLibrary
,但LoadLibrary
调用找不到我的 dll。
HMODULE theDllHell = LoadLibrary(L"mylib.dll");
我该怎么做,以便我的 dll 被复制到输出目录,我必须提供什么路径LoadLibrary
?
要从当前目录或 exe 目录加载库,只需库名,无需路径。有关完整的 Dll 搜索顺序,请参阅动态链接库搜索顺序http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586%28v=vs.85%29.aspx
加载应用程序的目录。 当前目录。 系统目录。使用 GetSystemDirectory 函数获取该目录的路径。 16 位系统目录。没有函数获取这个目录的路径,但是被搜索了。 Windows 目录。使用 GetWindowsDirectory 函数获取该目录的路径。 PATH 环境变量中列出的目录。
如果要将库复制到输出目录,请将此库项目添加到解决方案。添加模块将位于同一目录中。您还可以在 mylib 项目中使用 Post-Build Step 将 mylib.dll 复制到您需要的任何目录。
首先:假设您已将 DLL 添加到项目中,并且它在 SolutionExplorer 面板中可见,只需右键单击它并:
如果我没有记错选项,现在应该在合理的情况下将其复制到输出目录。参考:MSDN 上的文件属性
第二:LoadLibrary 以传统的 Windows 特定顺序搜索一系列路径。您几乎总是可以确定的路径是:
请查看文档:LoadLibraryA 函数,例如提到的“SetDllDirectory”,您认为它非常有用。此外,这里是详细解释的搜索路径顺序:动态链接库搜索顺序
编辑:当然,您可以只向 LoadLibrary 提供文件的 CWD 相对或完整绝对路径。这总能解决问题,但是 - 我不推荐它,因为当应用程序要在各种版本和语言的操作系统上运行时,手动确定路径可能不是一件容易的事!