【问题标题】:Start exe from batch script and get error code when missing dll从批处理脚本启动 exe 并在缺少 dll 时获取错误代码
【发布时间】:2017-12-21 07:38:41
【问题描述】:

如果可执行文件在启动时没有丢失的 dll,我需要自动测试。这种检查是通过 Jenkins(持续集成)来完成的,它可以执行批处理脚本。

尽管我进行了所有测试,但如果缺少一个或多个 dll,我还是找不到使用批处理脚本启动可执行文件并获取错误代码的方法。

它适用于“CALL myexecutable.exe”,它在缺少 dll 时返回不同于 0 的代码(-1073741515),但显然,我需要手动停止程序。

我通过混合几个批处理脚本(一个执行 CALL,另一个在休眠几秒钟后终止可执行文件的进程,等等),尝试了很多东西,但唯一的当缺少 dll 时,我发现代码不同于 0 的方式是使用“CALL myexecutable.exe”...

编辑:实际上,为了简化,我搜索了一种方法来检测从批处理文件启动的 exe 在启动时失败(但目前,我没有找到自动关闭程序的方法,因为当 dll 是丢失,会出现一个带有错误消息的对话框)。我不在乎知道涉及哪个dll。就我而言,我可以假设如果程序在启动时失败,原因是缺少 dll。

有人有想法可以帮助我吗?

【问题讨论】:

  • IMO 这是不可能的。即使程序中引用的 .dll 不在路径中,您如何从外部知道当前情况下是否需要它们?
  • 一个非常幼稚的方法是使用 sysinternals 中的 strings.exe 来搜索 .dll 文件的程序代码并检查它们是否在 For /f "delims=" %A in ('strings -n 7 YourProgram.exe^|findstr /i "\.dll"') do @where /Q "%A"||@Echo %A not found 的路径中
  • 其实所有需要的dll都和exe在同一个目录下。我想用 Jenkins 自动检查程序的安装程序 (.msi) 是否部署了所有需要的 dll,即使有人添加了需要新 dll 的新功能并且他忘记将其添加到安装程序中。但如果这不可能,我会忘记这个想法。
  • 我不知道程序外部是否需要 dll,但是当您执行缺少 dll 的 exe 时,会出现错误消息并且程序停止。我认为有一种方法可以通过错误代码检测程序失败(批处理命令 CALL 就是这种情况,但程序需要手动停止)。

标签: batch-file dll


【解决方案1】:

Dependency Walker 将允许以间接方式捕获未解析的 DLL。

depends.exe /c /ot:a-ldd.txt a.exe
findstr "Error: " a-ldd.txt > nul && echo unresolved

Windows 操作系统似乎会在弹出警报之前检查注册表设置。我猜这可以阻止整个机器的弹出窗口。

reg query HKLM\SYSTEM\CurrentControlSet\Control\Windows
reg add HKLM\SYSTEM\CurrentControlSet\Control\Windows /v ErrorMode /t REG_DWORD /f /d 2

我还没有找到一种方法来禁用每个进程的弹出窗口。 answer to a question on suppressing crash alerts 表示 SetErrorMode 调用仅影响当前进程(我在调用 SetErrorMode(0x8003) 后从 PowerShell 脚本启动可执行文件时尝试抑制丢失的 DLL 警报失败)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-24
    • 2016-12-13
    • 2011-11-01
    • 2011-03-27
    • 2023-03-31
    相关资源
    最近更新 更多