2

我有一个包含非托管 dll 的托管 c++/cli 项目。

我用 加载非托管 dll LoadLibrary,但LoadLibrary调用找不到我的 dll。

  HMODULE theDllHell = LoadLibrary(L"mylib.dll");

我该怎么做,以便我的 dll 被复制到输出目录,我必须提供什么路径LoadLibrary

4

2 回答 2

1

要从当前目录或 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 复制到您需要的任何目录。

于 2012-11-07T09:53:22.057 回答
1

首先:假设您已将 DLL 添加到项目中,并且它在 SolutionExplorer 面板中可见,只需右键单击它并:

  • 在 BuildAction 到“内容”
  • 在 CopyToOutputDir 中选择“CopyIfNewer”

如果我没有记错选项,现在应该在合理的情况下将其复制到输出目录。参考:MSDN 上的文件属性

第二:LoadLibrary 以传统的 Windows 特定顺序搜索一系列路径。您几乎总是可以确定的路径是:

  • 您当前的工作目录
  • 系统 DLL 目录,例如 %windir%\system32

请查看文档:LoadLibraryA 函数,例如提到的“SetDllDirectory”,您认为它非常有用。此外,这里是详细解释的搜索路径顺序:动态链接库搜索顺序

编辑:当然,您可以只向 LoadLibrary 提供文件的 CWD 相对或完整绝对路径。这总能解决问题,但是 - 我不推荐它,因为当应用程序要在各种版本和语言的操作系统上运行时,手动确定路径可能不是一件容易的事!

于 2012-11-07T09:53:53.510 回答