CreateProcess и CreatePipe для выполнения процесса и возврата вывода в виде строки в VC ++

Я пытаюсь использоватьCreateProcess а такжеCreatePipe выполнить процесс из приложения Windows Forms C ++ / CLR в Visual Studio 2010.

Из моего приложения Windows Forms я хочу выполнить дочерний процесс (консольное приложение) и вернуть результат в видеstd::string, std::wstring, или жеSystem::String^ в моем приложении Windows формы. Кроме того, я не хочу, чтобы вновь созданный дочерний процесс порождал окно.

Консольное приложение - мое собственное создание, поэтому я также могу контролировать его источник.

Я видел следующие примеры, но я не понимаю, как изменить код, чтобы выполнить то, что я пытаюсь сделать:

MSDNkguiБолее простая функция на основе MFC

Код MSDN представляется в виде двух консольных приложений, одно из которых вызывает другое. Код смущает меня. Я работаю в C ++ около 4 месяцев, поэтому до сих пор не все понимаю. Похоже, для ссылки на текстовый файл, что мне не нужно делать.

Есть ли более простой способ сделать это, чем 200+ строк кода MSDN или 300+ строк кода kgui?

ОтветВот было полезно, но более упрощенно. Я надеялся увидеть базовый исходный пример (предпочтительнее тот, который не содержит сотен строк сложного кода). Я бы использовал код MFC, но мне было трудно адаптировать его к моим целям (я не использую MFC).

Ниже приведена моя адаптация кода из Code Project:

string ExecuteExternalFile(string csExeName, string csArguments)
{
  string csExecute;
  csExecute=csExeName + " " + csArguments;

  SECURITY_ATTRIBUTES secattr; 
  ZeroMemory(&secattr,sizeof(secattr));
  secattr.nLength = sizeof(secattr);
  secattr.bInheritHandle = TRUE;

  HANDLE rPipe, wPipe;

  //Create pipes to write and read data

  CreatePipe(&rPipe,&wPipe,&secattr,0);
  //

  STARTUPINFO sInfo; 
  ZeroMemory(&sInfo,sizeof(sInfo));
  PROCESS_INFORMATION pInfo; 
  ZeroMemory(&pInfo,sizeof(pInfo));
  sInfo.cb=sizeof(sInfo);
  sInfo.dwFlags=STARTF_USESTDHANDLES;
  sInfo.hStdInput=NULL; 
  sInfo.hStdOutput=wPipe; 
  sInfo.hStdError=wPipe;

  //Create the process here.

  CreateProcess(0,(LPWSTR)csExecute.c_str(),0,0,TRUE,NORMAL_PRIORITY_CLASS|CREATE_NO_WINDOW,0,0,&sInfo,&pInfo);
  CloseHandle(wPipe);

  //now read the output pipe here.

  char buf[100];
  DWORD reDword; 
  string m_csOutput,csTemp;
  BOOL res;
  do
  {
                  res=::ReadFile(rPipe,buf,100,&reDword,0);
                  csTemp=buf;
                  m_csOutput+=csTemp;
  }while(res);
  return m_csOutput;
}

Я попытался использовать это из моего приложения Windows Forms, и хотя оно компилируется нормально и не вызывает никаких ошибок, оно, похоже, тоже не работает. Понятия не имею почему.

Вот как я выполнил приведенный выше код:

std::string ping = ExecuteExternalFile("ping.exe", "127.0.0.1");

Похоже, он ничего не делал, за исключением того, что при первом выполнении он выдает очень странные 3 символа в качестве вывода, затем при последующих выполнениях ничего не происходит.

Ответы на вопрос(2)

Ваш ответ на вопрос