【发布时间】:2017-06-19 14:54:39
【问题描述】:
简短说明:
使用不正确的 exe 或 com 文件作为参数从 C# 启动 cmd.exe 进程会打开“不支持的 16 位应用程序”窗口。 知道如何检测/抑制此窗口并向调用者报告错误吗?
更长的解释:
在将我们的服务器应用程序从 VMS 移植到 .NET 时,我编写了一个 VMS/DCL 命令解释器,因为我们需要支持 DCL 命令脚本,并且我们不允许接触支持 DCL 脚本的业务层。 DCL 解释器现在还需要调用本机程序和 cmd.exe scipts。
为此,我的 DCL 解释器支持“DCL”命令,该命令在隐藏窗口中启动 cmd.exe 进程,重定向输入/输出和/或将 DCL 参数作为脚本传递给 cmd.exe。 现在,当传递了一个错误的脚本文件(例如,带有“.COM”扩展名的 DCL 命令文件)时,cmd.exe 会尝试启动文件/程序并启动一个模式“不支持的 16 位应用程序" 窗口,这与 WindowStyle 和 CreateNoWindow 无关。
由于它在服务器上运行,我需要关闭/抑制窗口并向我的 DCL 报告错误。
我的解决方案:
到目前为止,我能找到的唯一解决方案是检查已启动进程的 MainWindowTitle 是否有“Unsupported 16-Bit Application”,终止该进程并向 DCL 报告错误。
但不幸的是,由于它在单独的进程中运行,并且 DCL 不一定需要等待进程结束,因此没有定义标题显示的时间点,并且检查可能为时过早而失败。
有什么想法吗?
【问题讨论】:
-
一种方法是事先或通过
getbinarytype检查应用程序的文件签名。然而,在脚本中查找程序集可能有点烦人。 -
您对 cmd.exe 的 I/O(标准输入和标准输出)是一个流。因此,请确保将流设置为 UTF8。然后您可以从流中获取 byte[] 数组并使用 Encoding.Unicode 获取 16 位数据。
-
其实getbinarytype这个想法至少可以防止某种错误。我可以解析 .com 和 .exe 并验证它是二进制文件,然后再将其交给 cmd.exe。谢谢!
-
致jdweng:对不起,你没有得到这个问题。这不是编码问题。
-
致 Manfred Radlwimmer:嗯,我为传递的命令尝试了以下操作:评估文件路径(我必须在 PATH environmentVariable 和 workingDir 中搜索匹配的文件)并将结果提供给 GetBinaryType。 GetBinaryType 返回 true 和 SCS_DOS_BINARY 作为文件类型。有点出乎意料:)