2010-07-20 33 views
2

J'ai un problème avec l'API GetCommandLine.Nom de processus manquant dans GetCommandLine

Il renvoie généralement le nom de l'exécutable suivi d'un espace et d'arguments. Comme le dit la documentation, le premier jeton peut ne pas avoir un chemin complet vers l'image et bla bla bla.

Je ne ai jamais eu de problèmes jusqu'à présent que je CreateProcess avec lpApplicationName NULL

Si j'utilise:

CreateProcess (NULL, "\" c: \ MYEXE.EXE \ » param1 param2" ,.)

GetCommandLine renvoie «c: \ myexe.exe param1 param2» comme prévu.

Mais si je l'utilise:

CreateProcess ("c: \ MYEXE.EXE", "param1 param2")

GetCommandLine retourne uniquement "param1 param2".

Donc la question est, comment puis-je savoir si le nom de l'exécutable est donné dans cmd-line si une autre application lance la mienne?

En outre, le code de démarrage MFC suppose que le premier jeton dans cmdline est le nom de l'exécutable et l'ignore. Mais si vous lancez une application MFC avec le deuxième exemple d'API CreateProcess, le code MFC ignorera le premier argument.

Cordialement, Mauro.

Répondre

2

J'ai une solution de contournement qui peut être utile dans un cas comme celui-ci. Je suppose que nous pouvons toujours vérifier comment notre module a été démarré. Dans ce cas, nous devrions vérifier le premier argument. Je vais écrire du code parce que j'ai un problème avec l'anglais. Voici deux façons:

Le premier cas. nous pouvons comparer le nom du module avec le premier argument de la ligne de commande. quelque chose comme ceci:

const TCHAR* csCommandLine = ::GetCommandLine(); 

// Attention!!! the first symbol can be quete 

if (*csCommandLine == _T('\"')) 
    csCommandLine++; 

TCHAR sModuleFileName[MAX_PATH]; 

DWORD dwModuleFileName = ::GetModuleFileName(NULL, sModuleFileName, MAX_PATH); 

if (dwModuleFileName && !_tcsncmp(csCommandLine, sModuleFileName, dwModuleFileName)) { 

    // The command line contains the module name. 
} 

Le second cas. nous pouvons essayer d'obtenir les attributs de fichier pour le premier argument de ligne de commande quelque chose comme ceci:

// Attention !!! ne l'utilisez pas si vous passez un chemin de fichier dans les arguments de la ligne de commande.

int nArgc; 

LPTSTR* szArglist = ::CommandLineToArgvW(::GetCommandLine(), &nArgc); 

if (nArgc && ::GetFileAttributes(szArglist[0]) != INVALID_FILE_ATTRIBUTES) { 

    // The command line contains the module name. 
} 

::LocalFree(szArglist); 

J'espère que ça peut être utile à quelqu'un.

Cordialement, Vladimir

+0

Salut Vladimir. J'ai décidé d'ignorer comme MFC. Ce –

+0

est une mauvaise idée, sauf si vous avez un spécifique * * besoin pour que votre demande soit lancé par code bogué que vous ne pouvez pas réparer. –

1

pas votre problème. C'est le travail de l'autre application de construire correctement la ligne de commande. Vous devez simplement supposer que le premier argument est un nom de l'exécutable comme prévu et sauter dessus.