如何在不同目录中运行带有DLL的.exe文件?

11

我知道这个问题在别处已经被讨论过了,但我没有找到我想要的答案。我的问题是:我有一个C++应用程序,使用了很多(超过20-30个)DLL文件。我已经在Visual Studio 2010项目中定义了将.exe文件复制到ProjectDir中(以便一切整洁明了),但当.exe文件仅位于ProjectDir中时,它无法访问存储在bin文件夹中的DLL文件和许多其他文件。

我能否以某种方式指定DLL文件夹,以便应用程序知道它们的位置?(<myapp>.exe.local文件夹方法在我的Windows 7中不起作用)


2
DLL应该与EXE文件放在同一个目录下,这是Windows首先查找的位置。任何其他方案都会扣除1000分。 - Hans Passant
2
@Hans Passant:你说的“任何其他方案都会扣除1000分”是什么意思? - Patryk
有太多好的理由不去做这件事。 - Hans Passant
2
@Hans:你能提一下原因吗?想了解一下知识上的情况。 - Nav
你可以使用私有程序集清单将dll放在子目录中 - Martin Ba
2个回答

4
首先,没有必要将你的exe文件复制到项目目录中,当你在调试项目时,无论你的.exe文件创建在哪里,运行目录都会是你的项目目录。之后,当你尝试导入dll时,如果你相对地查找它,Windows首先会在运行目录中查找该dll,然后检查是否能在定义的系统PATH变量所在的目录中找到该dll,但如果你检查绝对地址,则不会进行查找。
因此,第一个技巧是将所有dll路径设置为绝对路径,以便轻松导入dll且无需搜索,但如果你想将应用程序移动到另一台计算机上,就会出现很多问题(例如:HINSTANCE hDLL = LoadLibrary(L"C:\\mydll.DLL");)。其次,你可以相对于运行目录(而不是应用程序路径)给出dll路径,并且还可以为其指定目录(例如:HINSTANCE hDLL LoadLibrary("..\\dlls\\mydll.dll"))。

1

是的,我知道这是一个可能性,我忘了提到它,但我想把这个项目交给别人,那怎么办? - Patryk
好的,我还没有尝试过,但这个解决方案似乎很不错。http://www.codeguru.com/Cpp/W-P/dll/article.php/c99 - Simone-Cu
如果你要把项目交给别人,看起来你需要收集所有的DLL并将它们放在他的windows/system32目录下,对吗? - Pete Wilson
特别是使用注册表的部分。 - Simone-Cu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接