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

Winapi 在没有.NET的系统上启动.NET应用程序时,带有SEE_MASK_FLAG_NO_UI的ShellExecuteEx显示错误,winapi,shellexecuteex,Winapi,Shellexecuteex,Win32函数调用的ShellExecuteEx在其SHELLEXECUTEINFO结构中有一个标志请参见\u MASK\u flag\u NO\u UI,该标志应禁止在启动应用程序时因错误而显示的任何错误对话框 MSDN文档对此非常明确: SEE_MASK_FLAG_NO_UI 0x00000400. Do not display an error message box if an error occurs. 在我的例子中,我在没有安装.NET的Windows XP系统上启动.NET可

Win32函数调用的
ShellExecuteEx
在其
SHELLEXECUTEINFO
结构中有一个标志
请参见\u MASK\u flag\u NO\u UI
,该标志应禁止在启动应用程序时因错误而显示的任何错误对话框

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);
}
#包括
int wmain(int argc,wchar_t*argv[])
{
SHELLEXECUTEINFO信息;
memset(&info,0,sizeof(SHELLEXECUTEINFO));
info.cbSize=sizeof(SHELLEXECUTEINFO);
info.fMask=请参阅\u掩码\u标志\u否\u UI;
info.lpVerb=L“打开”;
info.lpFile=L“Xxx.exe”;
info.nShow=SW_SHOW;
返回ShellExecuteEx(&info);
}

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

为什么不使用该功能呢?

该标志只告诉shell不要显示错误消息。它不会影响已启动流程的UI。.NET.exe确实启动了,所以ShellExecuteEx()完成了它的工作,没有发现任何错误。它决定事后轰炸并让用户知道这件事,这不是您可以轻松修复的。

谢谢雷姆斯的建议。我不使用CreateProcess,因为它还显示错误对话框。我希望SEE_MASK_FLAG_NO_UI选项会有所帮助。你完全正确。解决这个问题的唯一方法是检测没有.NET,并避免完全启动应用程序。