【问题标题】:Windows 7: Running application using App Paths vs Batch FileWindows 7:使用应用程序路径与批处理文件运行应用程序
【发布时间】:2014-03-18 23:54:40
【问题描述】:

我在一个文件夹中有一个 (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 程序。我正在尝试改进流程,以便他们复制的内容将得到简化。

提前感谢您所有宝贵的 cmets 和建议。-Sam

【问题讨论】:

    标签: windows batch-file


    【解决方案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 环境变量中列出的目录中

    总的来说,我同意 MSDN 在他们的 DLL Redirection 页面上所说的内容

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

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

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

    【讨论】:

    • 谢谢你,大卫。你给了我很多工作。这是我们正在引入新 (Windows) 世界的旧 PB 应用程序。有这么多选择,我想看看最佳实践。我不想将 DLL 复制到同一目录的唯一原因是为了避免混乱。我也会探索这个选项。在我的批处理文件中,我将 DLL 目录添加到本地路径,但没有成功。您建议的批处理文件修复有效!所以,我想关键是将DLL复制到应用程序目录或使其成为当前目录。也感谢您的链接。
    • 您能否解释一下,如果将注册表项添加到“应用程序路径”适合其中任何一项?或者它在新窗口中被淘汰了?再次感谢!
    • App Path Documentation 看来,Path 条目的预期目的是在 PATH 环境变量前面加上应用程序的路径。 “它是 .exe 的完全限定路径。”关于库搜索,第 8 条,“请注意,这不包括 App Paths 注册表项指定的每个应用程序路径。计算 DLL 搜索路径时不使用 App Paths 项。”然而,这与您在上面所经历的结果相反。 MSDN 文档中可能缺少某些内容。
    猜你喜欢
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 2015-08-14
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多