Pregunta

Necesito cambiar la funcionalidad de una aplicación según el nombre del ejecutable.Nada enorme, solo cambiar las cadenas que se muestran y algunos identificadores internos.La aplicación está escrita en una combinación de código nativo y .Net C++-CLI.

Dos formas que he analizado son analizar la función GetCommandLine() en Win32 y completar con 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 el material de .Net AppDomain parece requerir mucho trabajo.

Entonces, ¿cuál es la forma más agradable/simple/más eficiente de determinar el nombre del ejecutable en C++/CLI?(Espero haberme 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 de estilo C tradicional, utiliza la función WinMain() de Windows.

¿Fue útil?

Solución

Llamar Obtener nombre de archivo del módulo() usando 0 como identificador del módulo.

Nota:tú poder También use el parámetro argv[0] para main o llame a GetCommandLine() si no hay main.Sin embargo, tenga en cuenta que estos métodos no necesariamente le brindará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 y un nombre de archivo.

Otros consejos

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

Utilizar el argv argumento 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í.

Utilice __argv[0]

Hay un método estático en ensamblaje que lo obtendrá en .NET.

Assembly.GetEntryAssembly().FullName

Editar:No me di cuenta de que querías el nombre del archivo...También puedes conseguirlo llamando al:

Assembly.GetEntryAssembly().CodeBase

Eso le dará la ruta completa al ensamblaje (incluido el nombre del archivo).

Puedo confirmar que funciona en win64/visual studio 2017/MFC

TCHAR szFileName[MAX_PATH + 1];
GetModuleFileName(NULL, szFileName, MAX_PATH + 1);
auto exe = CString(szFileName);

exe contiene la ruta completa al exe.

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