【发布时间】:2012-11-07 09:45:03
【问题描述】:
我有一个包含非托管 dll 的托管 c++/cli 项目。
我用LoadLibrary 加载非托管dll,但LoadLibrary 调用找不到我的dll。
HMODULE theDllHell = LoadLibrary(L"mylib.dll");
我必须做什么才能将我的 dll 复制到输出目录,我必须向LoadLibrary 提供什么路径?
【问题讨论】:
我有一个包含非托管 dll 的托管 c++/cli 项目。
我用LoadLibrary 加载非托管dll,但LoadLibrary 调用找不到我的dll。
HMODULE theDllHell = LoadLibrary(L"mylib.dll");
我必须做什么才能将我的 dll 复制到输出目录,我必须向LoadLibrary 提供什么路径?
【问题讨论】:
首先:假设您已将 DLL 添加到项目中,并且它在 SolutionExplorer 面板中可见,只需右键单击它并:
如果我没有记错选项,现在应该在合理的情况下将其复制到输出目录。参考:File Properties on MSDN
第二:LoadLibrary 以传统的 Windows 特定顺序搜索一系列路径。您可以几乎始终确定的路径是:
请查看文档:LoadLibraryA function 例如提到的“SetDllDirectory”,您认为它非常有用。另外,这里是详细解释的搜索路径顺序:Dynamic-Link Library Search Order
编辑:当然,您可以向 LoadLibrary 提供文件的 CWD 相对或完整绝对路径。这总能解决问题,但是 - 我不建议这样做,因为当应用程序要在各种版本和语言的操作系统上运行时,手动确定路径可能不是一件容易的事!
【讨论】:
要从当前目录或 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 复制到您需要的任何目录。
【讨论】: