2

ShellExecuteExWin32 函数调用SEE_MASK_FLAG_NO_UI在其结构中有一个标志,该标志SHELLEXECUTEINFO应禁止在启动应用程序时因错误而显示的任何错误对话框。

这里的 MSDN 文档对此非常明确:

SEE_MASK_FLAG_NO_UI
  0x00000400. Do not display an error message box if an error occurs.

在我的例子中,我在没有安装 .NET 的 Windows XP 系统上启动一个 .NET 可执行文件。我系统地收到以下消息,由 Windows 在对话框窗口中显示:

Xxx.exe - Application Error
The application failed to initialize properly (0xc0000135).
Click on OK to terminate the application.
[ OK ]

我不希望用户必须处理此消息。我宁愿从ShellExecuteEx我的程序中取回错误代码并能够优雅地处理它。这是我用来启动外部可执行文件的代码片段:

#include <windows.h>

int wmain(int argc, wchar_t* argv[])
{
    SHELLEXECUTEINFO info;
    memset(&info, 0, sizeof(SHELLEXECUTEINFO));
    info.cbSize = sizeof(SHELLEXECUTEINFO);
    info.fMask = SEE_MASK_FLAG_NO_UI;
    info.lpVerb = L"open";
    info.lpFile = L"Xxx.exe";
    info.nShow  = SW_SHOW;
    return ShellExecuteEx (&info);
}

如果系统上不存在 .NET,是否有官方方法可以抑制错误消息?还是我必须在执行应用程序之前自己检查这个特定条件(但我事先不知道它是 .NET 应用程序还是本机应用程序)。例如,如果我正在启动的应用程序缺少一些 DLL,该怎么办?

4

2 回答 2

4

该标志仅告诉外壳程序不显示错误消息。它不会影响已启动进程的 UI。.NET .exe 确实开始了,所以 ShellExecuteEx() 完成了它的工作并且没有看到任何错误。它决定事后轰炸并让用户知道它不是您可以轻松解决的问题。

于 2010-01-21T19:03:13.170 回答
0

为什么不使用CreateProcess函数

于 2010-01-21T10:56:12.487 回答