Comment obtenir le nom de l'exécutable de l'application dans WindowsC ++ / CLI?

StackOverflow https://stackoverflow.com/questions/124886

  •  02-07-2019
  •  | 
  •  

Question

Je dois modifier les fonctionnalités d'une application en fonction du nom de l'exécutable. Rien d’énorme, il suffit de changer les chaînes affichées et certains identifiants internes. L'application est écrite dans un mélange de code natif et .Net C ++ - CLI.

J'ai analysé la fonction GetCommandLine () dans Win32 de deux manières différentes, en analysant la méthode AppDomain et d'autres éléments du format .Net. Toutefois, l'utilisation de GetCommandLine ne fonctionnera pas toujours, car la ligne de commande est vide à partir du débogueur. Et les applications .Net AppDomain semblent nécessiter beaucoup de travail.

Quel est donc le moyen le plus simple, le plus simple et le plus efficace de déterminer le nom de l’exécutable en C ++ / CLI? (J'espère que je viens de manquer quelque chose de simple disponible en .Net.)

Éditer: Il convient de mentionner qu’il s’agit d’une application Windows utilisant l’interface utilisateur graphique C ++ / CLI. Par conséquent, il n’ya pas d’accès à la fonction principale traditionnelle du style C, il utilise la fonction Windows WinMain ().

Était-ce utile?

La solution

Appelez GetModuleFileName () en utilisant 0 comme une poignée de module.

Remarque: vous pouvez également utiliser le paramètre argv [0] pour commuter ou appeler GetCommandLine () s’il n’y en a pas. Cependant, gardez à l'esprit que ces méthodes ne vous donneront pas nécessairement le chemin complet du fichier exécutable. Ils vous redonneront la même chaîne de caractères que celle utilisée pour démarrer le programme. L'appel de GetModuleFileName () vous donnera toujours un chemin complet & amp; nom du fichier.

Autres conseils

La réponse de Ferruccio est bonne. Voici un exemple de code:

TCHAR exepath[MAX_PATH+1];

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

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

Utilisez l'argument argv pour main :

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

Vous devrez peut-être analyser la chaîne pour supprimer les informations de répertoire et / ou les extensions, mais le nom sera présent.

Utilisez __argv [0]

Il existe une méthode statique sur Assembly qui l’obtiendra pour vous dans .NET.

Assembly.GetEntryAssembly().FullName

Éditer: Je ne savais pas que vous vouliez le nom du fichier ... vous pouvez aussi l'obtenir en appelant:

Assembly.GetEntryAssembly().CodeBase

Cela vous donnera le chemin complet de l'assemblage (y compris le nom du fichier).

Je peux confirmer que cela fonctionne sous win64 / visual studio 2017 / MFC

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

exe contient le chemin d'accès complet à l'exe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top