2016-01-28 2 views
0

Таким образом, я использовал этот код для того, чтобы начать консольное приложение с аргументами:CreateProcess не начнет proccess с аргументами

#include <iostream> 
#include <windows.h> 

using namespace std; 

void StartProgram(char argv[]) 
{ 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 

    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    ZeroMemory(&pi, sizeof(pi)); 

    CreateProcess 
    (
     TEXT("PlayerDebug.exe"), 
     (LPSTR)argv, 
     NULL,NULL,FALSE, 
     CREATE_NEW_PROCESS_GROUP | CREATE_NO_WINDOW, 
     NULL,NULL, 
     &si, &pi 
    ); 
}; 

int main() 
{ 
    StartProgram("sound.wav"); 
    return 0; 
} 

«PlayerDebug.exe» отобразить аргументы, используемые для его вызова. Но когда я запускаю его с помощью CreateProcess, как я показал, он ничего не отображает. Я проверил и в Диспетчере задач, похоже, появляется, но до сих пор не отображает аргументы. Я также пытался написать cout << argv; в функции void StartProgram(char argv[]), и он вернул «sound.wav», что является правильным. Но, похоже, аргумент не передается в PlayerDebug.exe, и я не знаю почему. Что я сделал не так? (я новичок в программировании на С ++)

+1

Немного беспорядка с характерными типами здесь. Использование 'TEXT', как если бы вы столкнулись с ANSI или Unicode-текстом. Но затем противный бросок на «LPSTR». Тот факт, что код не будет компилироваться без кастомизации, должен был предупредить вас о проблеме. Ваш приказ не делает 'argv' фактически' LPSTR'. –

ответ

6

Второй параметр CreateProcess - это полная командная строка, а не только параметры EXE. Давайте два примера:

CreateProcess ("c:\\notepad.exe", 
       "c:\\notepad.exe c:\\wibble.txt", 
       ...); 

будет работать нормально (если есть копия notepad.exe и файл с именем wibble.txt в корне C :), а

CreateProcess ("c:\\notepad.exe", 
       "c:\\wibble.txt", 
       ...); 

запустит EXE, но не открывается файл. Это означает, что когда справочные системы вызывают второй параметр в командной строке, он не лежит - ему нужна вся командная строка.

Обратите внимание, что вы можете использовать NULL в качестве первого параметра, если вся командная строка находится во втором параметре. Вот как я обычно использую его на самом деле.

+4

Обратите внимание, что второй аргумент должен быть записываемой памятью (если вы вызываете версию Unicode), передать строковый литерал небезопасно. –

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