我有一个(PowerBuilder)应用程序(我们称之为MyApp.exe)在一个包含所有必需dll的子目录的文件夹中。我可以通过将应用程序路径和关联的路径变量添加到Windows App Paths注册表项来运行此应用程序。
[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,就像App Paths PATH设置一样。批处理文件错误无法找到DLL。在这种情况下我们需要注册DLL吗?为什么区别对待?
注意:
如果我将所有必需的DLL复制到与可执行文件相同的目录(没有DLL子目录),则运行正常,无需担心PATH或注册dll。
我们以前使用installShield进行安装,但是管理员有自动脚本来复制文件,他们在第一次安装后回避了InstallShield程序。我正在尝试改进流程,因此他们复制的内容将会简化。
提前感谢您提出的所有宝贵意见和建议。-Sam
答案 0 :(得分:1)
为什么区别对待?
因为在搜索库时Windows是一团糟。见http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586.aspx#search_order_for_desktop_applications
搜索顺序的确定方式有很多,但一般来说就像这样
检查图书馆......
总体而言,我同意MSDN在其DLL Redirection页面上所述的内容
最好将应用程序DLL安装在包含应用程序的同一目录中
但是,如果您要使用子文件夹来组织应用程序, 您可以查看使用Application Manifests。要尝试的其他方法是将库目录设置为工作目录
@ECHO off
SETLOCAL
SET "CURDIR=%~dp0"
PUSHD "%CURDIR%\dll"
start "" /D "%CURDIR%\dll" "%CURDIR%\myApp.exe"
POPD
ENDLOCAL