2010-10-22 19 views
15

Duplicar posible:
How to get the application executable name in Windows (C++ Win32 or C++/CLI)?¿Cómo puedo obtener el nombre del archivo ejecutable de la instancia actual de la aplicación win32 C++ nativa?

¿Cómo puedo obtener la ruta de nombre de archivo & de la instancia actual de dentro de mi aplicación nativa C++ Win32?

Por ejemplo; si mi solicitud fue c: \ proyectos \ testapps \ getapppath.exe sería capaz de decir que el camino es c: \ proyectos \ testapps \ getapppath.exe

Respuesta

28

Usted puede hacer esto a través de la función GetModuleFileName.

TCHAR szFileName[MAX_PATH + 1]; 

GetModuleFileName(NULL, szFileName, MAX_PATH + 1) 
+0

Eso es todo. Sabía que era algo simple. –

3

GetCurrentProcess, entonces QueryFullProcessImageName

Otras respuestas son mejores para su propio proceso - este es el preferido para los remotos. Por the docs:

Para recuperar el nombre del módulo del proceso actual , utilice la función GetModuleFileName con un identificador de módulo NULL . Esto es más eficiente que que llamar a la función GetProcessImageFileName con como manejador del proceso actual.

para recuperar el nombre del módulo principal ejecutable de un proceso remoto en formato de ruta Win32, utilice la función QueryFullProcessImageName.

1

ACTUALIZACIÓN: sólo funciona para las aplicaciones de consola!

ruta del programa se pasa como primer argumento, se almacena en argv[0] en la función main(argc, argv[]).

+5

No, no es así. Windows pasa la cadena de parámetros sin modificar pasada como el 2 ° parámetro a CreateProcess. Puede contener cualquier cosa. SI solo se pasa 1 cadena a CreateProcess, entonces buscará la ruta al exe en argv [0] - pero la ruta no tiene que ser canónica de ninguna manera, simplemente satisfaga la función SearchPath. Sin duda es una convención, pero no hay garantía de que argv [0] contenga algo remotamente utilizable. –

+1

Eso es lo que estaba pensando, pero la firma de mi winmain es int APIENTRY _tWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) –

+0

Excepto que si se utilizó una de las tres llamadas de poscl execl, execle o execlp para iniciar el programa, usted está a merced del programa que hizo que el ejecutivo solicite el valor en argv [0]. –

0

probados:

int _tmain(int argc, _TCHAR *argv[]) 
{ 
    _tprintf(L"%s", argv[0]); 
    return 0; 
} 

imprime ruta completa.

+1

esto no funciona para aplicaciones GUI (con WinMain) –

+0

Verdadero. La solución de @ Garett funciona para eso. – egrunin

Cuestiones relacionadas