Windows 7:使用App Paths与Batch File运行应用程序

时间:2014-03-18 23:54:40

标签: windows batch-file

我有一个(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吗?为什么区别对待?

注意:

  1. 如果我将所有必需的DLL复制到与可执行文件相同的目录(没有DLL子目录),则运行正常,无需担心PATH或注册dll。

  2. 我们以前使用installShield进行安装,但是管理员有自动脚本来复制文件,他们在第一次安装后回避了InstallShield程序。我正在尝试改进流程,因此他们复制的内容将会简化。

  3. 提前感谢您提出的所有宝贵意见和建议。-Sam

1 个答案:

答案 0 :(得分:1)

  

为什么区别对待?

因为在搜索库时Windows是一团糟。见http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586.aspx#search_order_for_desktop_applications

搜索顺序的确定方式有很多,但一般来说就像这样

检查图书馆......

  1. 已经加载到内存中
  2. 在KnownDLL列表
  3. 在应用程序的目录中
  4. 在系统目录
  5. 在16位系统目录中
  6. 在Windows目录中
  7. 在当前工作目录中
  8. 在PATH环境变量
  9. 中列出的目录中

    总体而言,我同意MSDN在其DLL Redirection页面上所述的内容

      

    最好将应用程序DLL安装在包含应用程序的同一目录中

    但是,如果您要使用子文件夹来组织应用程序, 您可以查看使用Application Manifests。要尝试的其他方法是将库目录设置为工作目录

    @ECHO off
    SETLOCAL
    SET "CURDIR=%~dp0"
    PUSHD "%CURDIR%\dll"
    start "" /D "%CURDIR%\dll" "%CURDIR%\myApp.exe"
    POPD
    ENDLOCAL