2017-01-04 1 views
-1

J'ai un peu de problème en utilisant CreateProcess().Arguments de ligne de commande CreateProcess

Dans cet exemple, CreateProcess() fonctionne parfaitement bien:

bSuccess = CreateProcess(
       TEXT("os-util.exe"), 
       TEXT("os-util.exe 0x273e:0x0007:0x0100 --get-channel"), NULL, NULL, TRUE, 
       0, 
       NULL, szFileName, &si, &pi); 

Le problème est que je veux modifier la ligne de commande que je passe. J'ai essayé quelques solutions, mais elles ne m'ont pas donné de bons résultats. Par exemple:

LPWSTR cmdArgslistSetChannel[] = { TEXT("os-util.exe"), TEXT("0x273e:0x0007:0x0100"), TEXT("--set-channel"), TEXT("11") }; 
bSuccess = CreateProcess(
       TEXT("os-util.exe"), 
       cmdArgslistSetChannel, NULL, NULL, TRUE, 
       0, 
       NULL, szFileName, &si, &pi); 
  1. comment puis-je changer juste une partie de la TEXT("")? Comment puis-je faire la ligne de commande à partir de plusieurs TEXT("")?

Si aucune de ces options n'est disponible, que peut-on faire? Je veux une poussée de bouton d'interface utilisateur pour appeler CreateProcess() avec différents arguments de ligne de commande.

+2

Pourquoi utilisez-vous TEXT en premier lieu. Avez-vous vraiment besoin de supporter Windows 98? Pourquoi n'allez-vous pas avec le temps et utilisez Unicode? –

+0

'cmdArgslistSetChannel' doit être' PWSTR' mais pas 'PWSTR *' comme dans votre code. alors votre question comment chaîne de format? – RbMm

+0

On dirait que vous auriez juste besoin d'ajouter à votre chaîne? Cela devrait être facile. Et si vous vérifiez la [documentation pour CreateProcess] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425 (v = vs.85) .aspx), il n'accepte pas un tableau de chaînes dans le deuxième paramètre, donc pas sûr de ce que vous essayez même là. – crashmstr

Répondre

2

Utilisez std::wstring et concaténations chaîne pour construire dynamiquement votre ligne de commande, par exemple:

std::wstring cmdArgslistSetChannel = L"os-util.exe"; 
cmdArgslistSetChannel += L" 0x273e:0x0007:0x0100"; 
cmdArgslistSetChannel += L" --set-channel"; 
cmdArgslistSetChannel += L" 11"; 
bSuccess = CreateProcessW(
       L"os-util.exe", 
       &cmdArgslistSetChannel[0], 
       NULL, NULL, TRUE, 0, 
       NULL, szFileName, &si, &pi); 

Vous pouvez également utiliser std::wostringstream pour l'accumulation, puis récupérer un std::wstring de celui-ci:

std::wostringstream cmdArgslistSetChannel; 
cmdArgslistSetChannel << L"os-util.exe"; 
cmdArgslistSetChannel << L" " << L"0x273e:0x0007:0x0100"; 
cmdArgslistSetChannel << L" " << L"--set-channel"; 
cmdArgslistSetChannel << L" " << L"11"; 

std::wstring cmd = cmdArgslistSetChannel.str(); 
bSuccess = CreateProcessW(
       L"os-util.exe", 
       &cmd[0], 
       NULL, NULL, TRUE, 0, 
       NULL, szFileName, &si, &pi); 

Soit Ainsi, vous pouvez remplacer toute sous-chaîne individuelle si nécessaire.

+0

Il est très rare de transmettre à la fois * lpApplicationName * et * lpCommandLine * à 'CreateProcess'. Le seul moment où cela a du sens est, si vous ne voulez pas passer l'image exécutable comme premier argument de la ligne de commande. Puisque vous implémentez la convention C standard pour passer l'image exécutable comme premier argument de ligne de commande, passez simplement 'nullptr' pour * lpApplicationName *. – IInspectable