Я пытаюсь использовать devcon.exe для проверки состояния различных аппаратных средств. В этом примере я пытаюсь проверить статус SATA HBA, но devcon о нем скулит. Вот код:Аргументы, передаваемые CreateProcess, не обрабатываются, как я ожидал
int main(int argc, char** argv) {
std::string cmdLine("\"C:\\Users\\afalanga\\Documents\\Visual Studio 2010\\Projects\\PlayGround\\Debug\\devcon.exe\" status PCI\\VEN_8086^&DEV_3A22^&SUBSYS_75201462^&REV_00");
char* pCmdLine(new char[cmdLine.length() + 10]);
memset(pCmdLine, 0, cmdLine.length() + 10);
for(int i(0); i < cmdLine.length(); i++)
pCmdLine[i] = cmdLine.at(i);
STARTUPINFO si = { sizeof(STARTUPINFO) };
PROCESS_INFORMATION pi = {0};
if(!CreateProcess(NULL, pCmdLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) {
std::cout << "Create child process failed. Error code: "
<< GetLastError() << std::endl;
return 1;
}
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return 0;
}
Проблема заключается в том, что, когда выше выполняется, Devcon жалуется, что «Нет соответствующих устройств обнаружено не было.» Однако, если я скопирую/вставлю эту командную строку из отладчика в мою командную строку и нажимаю клавишу ввода (или курс, удаляющий все охватывающие кавычки, которые размещает отладчик), команда выполняется отлично, как ожидалось.
В чем я ошибаюсь в моей передаче строки? То, что выше, является результатом чтения документов CreateProcess() в MSDN (выясняется, что первый аргумент необязательно необходим, и cmd-аргументы вообще не должны туда идти). Причина, по которой я выделяю 10 дополнительных байтов памяти для копирования строки, заключается в том, что «что угодно» может измениться в кишках функции CreateProcess(), это может сделать, не топая в другую память. По крайней мере, это была моя мысль, когда я это сделал.
Unrelated, но вы утечку памяти, и почему на земле будет один использовать 'memset' вместо простого'() '? – ildjarn