ShellExecuteEx con error SEE_MASK_FLAG_NO_UI muestra cuando se inicia la aplicación .NET en sistema sin .NET

StackOverflow https://stackoverflow.com/questions/2108159

  •  22-09-2019
  •  | 
  •  

Pregunta

El ShellExecuteEx Win32 llamada de función tiene un SEE_MASK_FLAG_NO_UI bandera en su estructura SHELLEXECUTEINFO, que debe suprimir cualquier diálogos de error que podrían aparecer debido a un error en el lanzamiento de una aplicación.

La documentación de MSDN aquí es bastante explícita al respecto:

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

En mi caso, estoy lanzando un .NET ejecutable en un sistema Windows XP que está instalado sin .NET. Recibo sistemáticamente el siguiente mensaje, que se muestra por Windows en una ventana de diálogo:

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

no quiero que el usuario tenga que tratar con este mensaje. Prefiero recibir un código de error de la ShellExecuteEx y ser capaz de manejar la situación con gracia en mi programa. Aquí está el fragmento de código que estoy usando para iniciar el ejecutable externo:

#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);
}

¿Hay una manera oficial de suprimir el mensaje de error si .NET no está presente en el sistema? O tengo para comprobar esta condición específica a mí mismo antes de ejecutar la aplicación (pero no sé con antelación si se trata de una aplicación .NET o una aplicación nativa). ¿Y si la aplicación que estoy empezando faltan algunos archivos DLL, por ejemplo?

¿Fue útil?

Solución

La bandera sólo dice el shell para no mostrar un mensaje de error. No afecta a la interfaz de usuario del proceso que comenzó. El .NET .exe realmente no empezar por lo ShellExecuteEx () lo hizo de trabajo y vio ningún error. Que decidió bombardear después y dejar que el conocimiento del usuario acerca de que no es algo que se puede arreglar fácilmente.

Otros consejos

¿Por qué no se utiliza el CreateProcess función

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top