2008-09-24 13 views
18

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.¿Cómo obtener el nombre del ejecutable de la aplicación en WindowsC++/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 de Windows GUI que usa C++/CLI, por lo tanto hay sin acceso a la función principal tradicional de estilo C, utiliza la función Windows WinMain().

Respuesta

35

Llamada GetModuleFileName() usando 0 como mango del módulo.

Nota: puede también usar el parámetro argv [0] en 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 programa. Llamar a GetModuleFileName() siempre le dará una ruta completa & nombre de archivo.

8

utilizar el argumento argv a 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 para escanear la cadena para eliminar la información del directorio y/o extensiones, pero el nombre estará allí.

+0

Esta solución tiene la ventaja añadida de ser multiplataforma. –

+0

Sí, lo hace, aunque no estoy buscando uno multiplataforma, solo uno para Windows usando Win32 o .Net. – Daemin

+3

Eso no funciona en el caso general. – tml

3

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 que el nombre del archivo ... también se puede obtener llamando a que:

Assembly.GetEntryAssembly().CodeBase 

que les permite conocer la ruta completa a la asamblea (incluyendo el nombre del archivo).

+0

Si bien este parecía ser el camino a seguir inicialmente, en realidad no funciona en la práctica, ya que el nombre del ensamblado es el mismo independientemente de en qué se configure el nombre del ejecutable. – Daemin

10

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")); 
+2

De msdn: 'Si la función falla, el valor de retorno es 0 (cero)' así que sí ... es posible que desee usar '==' en lugar de '! =' En su enunciado condicional –

4

Uso __argv [0]

+0

La respuesta más simple y la mejor . – Benio

+0

Solo si el programa comenzó con 'main' o' WinMain', y no 'wmain',' wWinMain'.Si "w" main es el punto de entrada, entonces debe usarse '__wargv'. El otro "argv" permanecería nulo. – Ajay

Cuestiones relacionadas