将C++中的dll文件从根目录移动到子文件夹

4
我正在使用Visual C++编写程序。该程序依赖于一些dll文件,但我不想将它们放在system32中。现在dll文件与我的 .exe 文件在同一个文件夹中,但我想将它们移至子文件夹中。问题是,如果我移动这些文件,我的应用程序将无法启动,并出现以下错误消息:

MyProgram.exe - 无法定位组件

无法启动此应用程序,因为找不到 myDll.dll 文件。重新安装应用程序可能会解决此问题。


我之前也遇到过同样的问题,并找到了解决方法,其中包括向注册表添加某些内容,但我忘记了具体操作步骤,并且现在无法再次找到该指南。

请问有人能帮助我吗?


听起来有点可疑,你需要将DLL文件放在子目录中。能否给出原因? - tenfour
我不需要将dll文件放在子文件夹中,我只是不喜欢将它们放在与我的程序相同的文件夹中,因为在我的看法中,在程序文件夹中有大约15-20个dll文件看起来很凌乱。 - Kvist
3个回答

3

解决这个问题的方法不止一种。正如其他人所提到的,您可以在注册表中修改应用程序的搜索路径。有时,您没有权限写入注册表,或者由于其他原因无法这样做,那么您可以显式设置dll路径,WinAPI函数为 SetDllDirectory,请参见MSDN


1
调用SetDllDirectory显然需要进程正在运行。这意味着使用此方法不能在奇怪的路径中放置隐式链接的DLL。 - Steve
1
我已经稍微研究了一下这个函数,但如果我理解正确的话,这个函数只能与延迟加载的dll文件一起使用,而我的dll文件不是这种类型的。 - Kvist

1
听起来你正在寻找 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths 键。完整信息请查看此处。简而言之,一个名为Path的字符串指向 DLL 搜索路径。例如,如果你的应用程序名为 "MyApp",则像这样的 .reg 文件可以解决问题:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\AppPaths\MyApp.exe]
@="C:\\Program Files\\MyCompany\\MyApp\\MyApp.exe"
"Path"="C:\\Program Files\\MyCompany\\MyApp\\DLLs"

0

我相信这就是你要找的文章:

http://www.codeguru.com/Cpp/W-P/dll/article.php/c99

每个应用程序现在都可以将其路径存储在注册表下的以下键中: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths 要使用应用程序路径,请为您的应用程序设置一个键,例如使用上面的ONE.EXE: HKEY_LOCAL_MACHINE...\CurrentVersion\App Paths\ONE.exe 将(默认)值设置为可执行文件的完整路径,例如: C:\Program Files\ONE\ONE.exe 添加一个名为Path的子键。

没错,那就是那篇文章。谢谢,我已经花了半天时间搜索也没找到! - Kvist

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