带有SEE_MASK_FLAG_NO_UI的ShellExecuteEx在没有.NET的系统上启动.NET应用程序时显示错误

时间:2010-01-21 09:39:17

标签: winapi shellexecuteex

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

MSDN文档here非常清楚:

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,例如?

2 个答案:

答案 0 :(得分:4)

该标志仅告诉shell不显示错误消息。它不会影响已启动进程的UI。 .NET .exe确实已经开始了,所以ShellExecuteEx()完成了它的工作并且没有看到任何错误。它决定随后炸弹并让用户知道它不是你可以轻易修复的东西。

答案 1 :(得分:0)

为什么不使用CreateProcess函数