cmd.exe созданный с помощью CreateProcess() не считывается из файла записи()

#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 , программа все равно будет работать.