【问题标题】:c# how to suppress "Unsupported 16-Bit Application" window popup in cmd.exe processc#如何在cmd.exe进程中抑制“不支持的16位应用程序”窗口弹出
【发布时间】: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 作为文件类型。有点出乎意料:)

标签: c# cmd


【解决方案1】:

SetErrorMode 实际上是解决方案,它甚至是记录在案的 errorMode。

以下代码行禁用消息框:

var oldMode = SetErrorMode(ErrorModes.SEM_FAILCRITICALERRORS);

以下行会将其设置回原始值:

SetErrorMode(oldMode );

【讨论】:

  • 好吧,不要这样做那个。至少使用 GetErrorMode() 这样您就不会过多地搞砸自己的过程。并且尝试不同的位值,你不会检查所有 32 个。
  • 好吧,我确实调用了 GetErrorMode,但我还没有找到我必须设置的位。但是通过设置所有 32 位,我至少可以看到 WER 参与其中,它是 32 位之一。事实上,由于没有记录,每一点都可能产生潜在的不良影响。
  • 真丢脸,这是一个记录在案的错误!我一定是在测试时搞砸了。值 1 = SEM_FAILCRITICALERRORS 完成这项工作!我会更新答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
相关资源
最近更新 更多