¿Cómo obtener el nombre del ejecutable de la aplicación en WindowsC ++ / CLI?

Necesito cambiar la funcionalidad de una aplicación basada en el nombre del ejecutable. Nada enorme, simplemente cambiando las cadenas que se muestran y algunos identificadores internos. La aplicación está escrita en una mezcla de código nativo y .NET C ++ – CLI.

Dos formas que he analizado son analizar la función GetCommandLine () en Win32 y rellenar el AppDomain y otras cosas en .Net. Sin embargo, el uso de GetCommandLine no siempre funcionará, ya que cuando se ejecuta desde el depurador, la línea de comando está vacía. Y las aplicaciones .Net AppDomain parecen requerir mucho relleno.

Entonces, ¿cuál es la forma más simple / simple / más eficiente de determinar el nombre del ejecutable en C ++ / CLI? (Estoy esperando que me haya perdido algo simple que está disponible en .Net).

Editar: Una cosa que debo mencionar es que esta es una aplicación GUI de Windows que usa C ++ / CLI, por lo tanto no hay acceso a la función principal tradicional de estilo C, usa la función Windows WinMain ().

Llame a GetModuleFileName () usando 0 como identificador de módulo.

Nota: también puede usar el parámetro argv [0] para main o llamar a GetCommandLine () si no hay main. Sin embargo, tenga en cuenta que estos métodos no necesariamente le darán la ruta completa al archivo ejecutable. Devolverán la misma cadena de caracteres que se utilizó para iniciar el progtwig. Llamar a GetModuleFileName () siempre le dará un nombre completo de ruta y archivo.

La respuesta de Ferruccio es buena. Aquí hay un código de ejemplo:

TCHAR exepath[MAX_PATH+1]; if(0 == GetModuleFileName(0, exepath, MAX_PATH+1)) MessageBox(_T("Error!")); MessageBox(exepath, _T("My executable name")); 

Usa el argumento argv para main :

 int main(int argc, char* argv[]) { printf("%s\n", argv[0]); //argv[0] will contain the name of the app. return 0; } 

Es posible que necesite escanear la cadena para eliminar la información del directorio y / o las extensiones, pero el nombre estará allí.

Use __argv [0]

Hay un Método estático en ensamblado que lo obtendrá en .NET.

 Assembly.GetEntryAssembly().FullName 

Editar: No me di cuenta de que quería el nombre del archivo … también puede obtenerlo llamando:

 Assembly.GetEntryAssembly().CodeBase 

Eso le proporcionará la ruta completa al ensamblado (incluido el nombre del archivo).