2017-01-04 4 views
-1

У меня проблема с CreateProcess().Аргументы командной строки CreateProcess

В этом примере CreateProcess() работает прекрасно:

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

Проблема заключается в том, что я хочу изменить командную строку, которую я прохожу. Я попробовал несколько решений, но они не дали мне хороших результатов. Например:

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. как я могу изменить только часть TEXT("")?

  2. Как я могу сделать командную строку от более чем одного TEXT("")?

Если ни один из этих вариантов не доступен, что можно сделать? Я хочу, чтобы кнопка кнопки пользовательского интерфейса вызывала CreateProcess() с различными аргументами командной строки.

+2

Почему вы используете ТЕКСТ в первую очередь. Вам действительно нужно поддерживать Windows 98? Почему бы вам не пойти со временем и не использовать Unicode? –

+0

'cmdArgslistSetChannel' должен быть' PWSTR', но не 'PWSTR *' как в вашем коде. так что ваш вопрос, как форматировать строку? – RbMm

+0

Похоже, вам просто нужно добавить к своей строке? Это должно быть легко. И если вы проверите [документацию для CreateProcess] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425 (v = vs.85) .aspx), он не принимает массив строки во втором параметре, поэтому не уверен, что вы даже пытаетесь там. – crashmstr

ответ

2

Используйте std::wstring и конкатенации строк, чтобы создать командную строку динамически, например:

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); 

В качестве альтернативы, используйте std::wostringstream для наращивания, а затем извлечь std::wstring из него:

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); 

Либо путь, вы можете затем заменить любую отдельную подстроку по мере необходимости.

+0

Очень редко встречаются оба * lpApplicationName *, а также * lpCommandLine * для 'CreateProcess'. Единственный раз, когда это имеет смысл, если вы не хотите передавать исполняемое изображение в качестве первого аргумента командной строки. Поскольку вы реализуете стандартное соглашение C для передачи исполняемого изображения в качестве первого аргумента командной строки, просто передайте 'nullptr' для * lpApplicationName *. – IInspectable

Смежные вопросы