2017-05-09 2 views
0

J'ai créé une nouvelle application de console Win32 . Il a ce point d'entrée principal:Explorateur transmettant le nom de chemin d'accès exécutable complet dans ses arguments de ligne de commande

int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) 

J'analyse des paramètres dans lpCmdLine:

LPWSTR *szArglist; 
int nArgs; 
szArglist = CommandLineToArgvW(lpCmdLine, &nArgs); 
if (nArgs >= 1 && wcslen(szArglist[0]) > 0) 
    productName = szArglist[0]; 
if (nArgs >= 2 && wcslen(szArglist[1]) > 0 && PathFileExists(szArglist[1])) 
    installPath = szArglist[1]; 

Je veux analyser le premier paramètre comme productName et le second paramètre comme installPath. Toutefois, si je lance ce programme à partir de explorer, il définit le premier paramètre comme chemin d'accès complet à l'exécutable.

Est-il possible de gérer ce comportement? Dans quelles situations Windows transmet-il des arguments à mon application? Comment puis-je ignorer ces derniers, et que ma demande accepte les arguments de ligne de commande comme suit:

application.exe "Product Name" "C:\Program Files\Product Name" 
+0

Le 1er paramètre est juste ce qui a été utilisé lors de la création du processus. Si vous tapez "calc.exe" dans la console, le 1er paramètre du processus calc sera juste cela. – zett42

+3

Obligatoire [lien OldNewThing] (https://blogs.msdn.microsoft.com/oldnewthing/20060515-07/?p=31203/). Et [ceci] (https://blogs.msdn.microsoft.com/oldnewthing/20100916-00/?p=12843). – zett42

Répondre

1

On dirait que j'ai juste besoin de changer mon approche par l'analyse syntaxique des arguments nommés:

LPWSTR *szArglist; 
int nArgs; 
szArglist = CommandLineToArgvW(lpCmdLine, &nArgs); 
BOOL skipNext = false; 
for (int i = 0; i < nArgs; i++) { 
    if (skipNext) { 
     skipNext = false; 
     continue; 
    } 
    if (wcscmp(szArglist[i], L"/path") == 0 && i + 1 < nArgs && wcslen(szArglist[i + 1]) > 0 && PathFileExists(szArglist[i + 1])) { 
     installPath = szArglist[i + 1]; 
     skipNext = true; 
    } 
    if (wcscmp(szArglist[i], L"/product") == 0 && i + 1 < nArgs && wcslen(szArglist[i + 1]) > 0) { 
     productName = szArglist[i + 1]; 
     skipNext = true; 
    } 
} 
+0

Oui, l'analyse des arguments nommés est l'approche habituelle pour le faire. Mais notez ce que [Raymond Chen écrit] (https://blogs.msdn.microsoft.com/oldnewthing/20100916-00/?p=12843): _Le premier paramètre à CommandLineToArgvW est censé être la valeur retournée par GetCommandLineW_ – zett42

+0

@ zett42 Savez-vous que Raymond est plutôt actif sur ce site? Il a posté des réponses utiles à certaines de mes questions. – Alexandru

+0

@ zett42 Attendez, vous êtes Raymond Chen déguisé? – Alexandru