2015-07-22 3 views
0

Я хотел бы, чтобы выполнить команду оболочки, чтобы обновить прошивку на мой PROCESOR ATMega 2560, как это:Выполнение команды с помощью Win32

avrdude.exe -c breakout -P ft0 -p m2560 -U flash:w:\"file.cpp.hex\":a 

я могу сделать это с помощью ShellExecute() функции:

ShellExecute(0, L"open", L"cmd.exe", L"/C avrdude.exe -c breakout -P ft0 -p  m2560 -U flash:w:\"file.cpp.hex\":a > log.txt", 0, SW_HIDE); 

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

CreateProcess(NULL, L"cmd /C avrdude.exe -c breakout -P ft0 -p m2560 -U flash:w:\"file.cpp.hex\":a", NULL, NULL, 0, 0, NULL, NULL, NULL, NULL); 
+1

Ну, что же ваш 'CreateProcess()' вернуть? Предполагая, что это ошибка, что означает 'GetLastError()' say? – zenzelezz

ответ

1

Проблема решена! Полный код:

STARTUPINFO si = { sizeof(STARTUPINFO) }; 
PROCESS_INFORMATION pi; 

if (!CreateProcess(L"C:\\Windows\\System32\\cmd.exe", 
    L" /C avrdude.exe -c breakout -P ft0 -p m2560 -U flash:w:\"file.cpp.hex\":a", 
    NULL, NULL, 0, 0, NULL, NULL, &si, &pi))  
{ 
    printf("CreateProcess failed (%d).\n", GetLastError()); 
    return -1; 
} 
+2

Это нехорошо. Второй параметр должен быть доступен для записи. И у вас также есть утечки. –

+2

Кроме того, зачем вообще вызывать 'cmd.exe', когда вы можете вместо этого ссылаться на' avrdude.exe'? –

+0

@DavidHeffernanL Вы не знаете, выполняет ли он ручки или нет, поскольку он не показывает код, который запускается, когда 'CreateProcess()' преуспевает. –

2

Использование CreateProcess() вместо ShellExecute() и предоставить свои собственные трубы, так что вы можете прочитать вывод процесса. MSDN есть статья на эту тему:

Creating a Child Process with Redirected Input and Output

Например:

LPWSTR cmdLine[] = L"avrdude.exe -c breakout -P ft0 -p m2560 -U flash:w:\"file.cpp.hex\":a"; 

SECURITY_ATTRIBUTES sa = {0}; 
sa.nLength = sizeof(sa); 
sa.lpSecurityDescriptor = NULL; 
sa.bInheritHandle = TRUE; 

HANDLE hStdOutRd, hStdOutWr; 
HANDLE hStdErrRd, hStdErrWr; 

if (!CreatePipe(&hStdOutRd, &hStdOutWr, &sa, 0)) 
{ 
    // error handling... 
} 

if (!CreatePipe(&hStdErrRd, &hStdErrWr, &sa, 0)) 
{ 
    // error handling... 
} 

SetHandleInformation(hStdOutRd, HANDLE_FLAG_INHERIT, 0); 
SetHandleInformation(hStdErrRd, HANDLE_FLAG_INHERIT, 0); 

STARTUPINFO si = {0}; 
si.cbSize = sizeof(si); 
si.dwFlags = STARTF_USESTDHANDLES; 
si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); 
si.hStdOutput = hStdOutWr; 
si.hStdError = hStdErrWr; 

PROCESS_INFORMATION pi = {0}; 

if (!CreateProcessW(NULL, cmdLine, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi)) 
{ 
    // error handling... 
} 
else 
{ 
    // read from hStdOutRd and hStdErrRd as needed until the process is terminated... 

    CloseHandle(pi.hThread); 
    CloseHandle(pi.hProcess); 
} 

CloseHandle(hStdOutRd); 
CloseHandle(hStdOutWr); 
CloseHandle(hStdErrRd); 
CloseHandle(hStdErrWr);