Domanda

Devo modificare la funzionalità di un'applicazione in base al nome dell'eseguibile. Niente di eccezionale, cambiando solo le stringhe visualizzate e alcuni identificatori interni. L'applicazione è scritta in una combinazione di nativo e .Net C ++ - codice CLI.

Due modi che ho visto sono di analizzare la funzione GetCommandLine () in Win32 e fare il giro con AppDomain e altre cose in .Net. Tuttavia, l'utilizzo di GetCommandLine non funzionerà sempre poiché quando viene eseguito dal debugger la riga di comando è vuota. E le cose .Net AppDomain sembrano richiedere molte cose in giro.

Quindi qual è il modo più semplice / semplice / più efficiente per determinare il nome eseguibile in C ++ / CLI? (Spero quasi di aver perso qualcosa di semplice disponibile in .Net.)

Modifica: una cosa che dovrei menzionare è che questa è un'applicazione GUI di Windows che usa C ++ / CLI, quindi non c'è accesso alla tradizionale funzione principale in stile C, usa la funzione Windows WinMain ().

È stato utile?

Soluzione

Chiama GetModuleFileName () utilizzando 0 come un handle di modulo.

Nota: puoi utilizzare anche il parametro argv [0] per main o chiamare GetCommandLine () se non è presente main. Tuttavia, tieni presente che questi metodi non ti forniranno necessariamente il percorso completo del file eseguibile. Restituiranno la stessa stringa di caratteri utilizzata per avviare il programma. Chiamare GetModuleFileName () ti darà sempre un percorso completo & amp; nome del file.

Altri suggerimenti

La risposta di Ferruccio è buona. Ecco un esempio di codice:

TCHAR exepath[MAX_PATH+1];

if(0 == GetModuleFileName(0, exepath, MAX_PATH+1))
    MessageBox(_T("Error!"));

MessageBox(exepath, _T("My executable name"));

Usa l'argomento argv per main :

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

Potrebbe essere necessario scansionare la stringa per rimuovere le informazioni sulla directory e / o le estensioni, ma il nome sarà lì.

Usa __argv [0]

Esiste un metodo statico su Assembly che lo otterrà per te in .NET.

Assembly.GetEntryAssembly().FullName

Modifica: non avevo capito che volevi il nome del file ... puoi farlo anche chiamando:

Assembly.GetEntryAssembly().CodeBase

Questo ti porterà al percorso completo dell'assembly (incluso il nome del file).

Posso confermare che funziona con Win64 / Visual Studio 2017 / MFC

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

exe contiene il percorso completo per exe.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top