我有一个(PowerBuilder)应用程序(我们称之为MyApp.exe),它位于一个子目录中,该子目录包含所有必需的dll。我能够运行此应用程序,通过添加应用程序路径和相关的路径变量到Windows应用程序路径注册表项。
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\App Paths\MyApp.EXE]
"Path"="C:\\Prog32\\MyAPP;C:\\Prog32\\MyAPP\\DLL\\;"
@="C:\\Prog32\\MyApp\\MyApp.EXE"
上面的运行文件。我甚至不需要注册DLL。
如果可能的话,我希望使用批处理文件运行它,因为用户可能会在不同的文件夹中安装同一应用程序的多个版本。当我试图在批处理文件中做同样的事情时,它找不到DLL。
@SETLOCAL
SET CURDIR=%~dp0
CD %CURDIR%
PUSHD %CURDIR%
SET PATH=%CURDIR%;%CURDIR%\dll;%PATH%
start "" %CURDIR%\myApp.exe
POPD
ENDLOCAL
我在与可执行文件MyApp.exe相同的目录中创建了此批处理。我希望它能找到DLL,就像应用程序路径PATH设置一样。批处理文件出错,无法找到DLL。在这种情况下,我们需要注册DLL吗?为什么要区别对待?
备注:
1.如果我将所有需要的DLL复制到与可执行文件相同的目录(没有DLL子目录),它就可以正常运行,而无需担心PATH或注册DLL。
1.我们以前使用installShield来安装,但是管理员有自动化的脚本来复制文件,他们在第一次安装后就避开了InstallShield程序。我正在努力改进这个过程,这样他们复制的东西就会简化。
提前感谢您的宝贵意见和建议。-山姆
2条答案
按热度按时间eivnm1vs1#
为什么要区别对待?
因为Windows在搜索库时很混乱。参见http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586.aspx#search_order_for_desktop_applications
如何确定搜索顺序有很多要素,但总的来说是这样的
去图书馆看看。
1.已载入内存
1.在KnownDLL列表中
1.在应用程序的目录中
1.在系统目录中
1.在16位系统目录中
1.在Windows目录中
1.在当前工作目录中
1.在PATH环境变量中列出的目录中
总的来说,我同意MSDN在他们的DLL Redirection页面上的说法
最好将应用程序DLL安装在包含应用程序的同一目录中
但是,如果您希望使用子文件夹来组织应用程序,则可以考虑使用Application Manifests。还可以尝试将库目录设置为工作目录
mqkwyuun2#
更改本地环境变量%PATH%对任何其他进程都没有影响,即使是您从该命令shell加载和执行的进程也没有影响。
进程“start”是一个部分例外:默认情况下,它从当前环境复制%PATH%的当前副本。新的控制台进程具有相同的%PATH%。但即使如此,在该环境中启动的进程也不会从环境中继承%PATH%:每个新进程都从注册表中获取其“path”的版本。
有一个解决方案:“setx”. SETX是改变实际路径值的windows命令,而不仅仅是改变本地环境变量。