#c #winapi
Вопрос:
Я создал дочерний процесс с помощью CreateProcess(). экземпляр cmd.exe. Первая команда передается при создании процесса, а вторая передается через WriteFile () после создания процесса. Первая работа выполнена, а вторая нет, и я не знаю причины, по которой. Пожалуйста, помогите
Код для создания процесса таков:
PROCESS_INFORMATION _info; char cmd[1024]; strcpy(cmd,"C:\Windows\system32\cmd.exe /k echo 1"); HANDLE _stdin_rd = NULL; HANDLE _stdin_wr = NULL; HANDLE _stdout_rd = NULL; HANDLE _stdout_wr = NULL; BOOL br; SECURITY_ATTRIBUTES sa; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle = TRUE; sa.lpSecurityDescriptor = NULL; br = CreatePipe(amp;_stdin_rd, amp;_stdin_wr, amp;sa, 0); br = SetHandleInformation(_stdin_wr, HANDLE_FLAG_INHERIT, 0); br = CreatePipe(amp;_stdout_rd, amp;_stdout_wr, amp;sa, 0); br = SetHandleInformation(_stdout_rd, HANDLE_FLAG_INHERIT, 0); STARTUPINFO si; ZeroMemory(amp;si, sizeof(STARTUPINFO)); ZeroMemory(amp;_info, sizeof(PROCESS_INFORMATION)); si.cb = sizeof(STARTUPINFO); si.dwFlags |= STARTF_USESTDHANDLES; si.hStdInput = _stdin_rd; si.hStdOutput = _stdout_wr; si.hStdError = _stdout_wr; br = CreateProcess(0, cmd,0,0,TRUE,CREATE_NO_WINDOW,0,0,amp;si,amp;_info); CloseHandle(_stdout_wr); CloseHandle(_stdin_rd); CloseHandle(_info.hProcess); CloseHandle(_info.hThread); printf("process created...n"); Sleep(320); printf("waitednn");
Код для связи с процессом таков:
char bufy[10240]; char kom[1024]; long unsigned int prt, ovs=0; for(int i=2;ilt;10; i){ if(!ReadFile(_stdout_rd,bufy ovs,10240-ovs,amp;prt,0)){ printf(" ERROR=%dn",GetLastError()); break; } ovs =prt; printf("respond: "); bufy[ovs]=0; printf("%sn",bufy); sprintf(kom,"/k echo %d",i); BOOL odgw = WriteFile(_stdin_wr,kom,strlen(kom),0,0); printf("sent(%s): %sn",odgw?"TRUE":"FALSE",kom); } return 0;
Все, что я получаю на выходе своей программы, это:
process created... waited respond: 1 D:gt; sent(TRUE): /k echo 2
Комментарии:
1. Вы не проверяете никаких ошибок. Начните добавлять код для этого.
2. Если ваш код скомпилирован, то это не C .
3. @Jabberwocky Я удалил проверку ошибок перед загрузкой сюда, потому что хотел, чтобы вы, люди, читали более четко. В любом случае, из моего вывода вы можете сделать вывод, что код застрял в ReadFile(). Где еще вам нужна проверка на ошибки?
4. @S. M. Какая часть этого не является C ?
5.
char *cmd = "C:
…
Ответ №1:
Я обнаружил ошибку. Команды, которые будут переданы впоследствии, не должны начинаться с /k
и должны заканчиваться n
. Тогда программа работает. Также при создании процесса может ничего не быть после /k
, программа все равно будет работать.