Я пытаюсь использовать CreateProcess
и CreatePipe
для выполнения процесса из приложения Windows Forms C ++ / CLR в Visual Studio 2010.
Из приложения Windows Forms я хочу выполнитьдочерний процесс (консольное приложение) и возвращает вывод в виде std::string
, std::wstring
или System::String^
в моем приложении Windows Forms.Кроме того, я не хочу, чтобы вновь созданный дочерний процесс порождал окно.
Консольное приложение - мое собственное создание, поэтому я также могу контролировать его источник.
Я виделследующие примеры, но я не понимаю, как изменить код, чтобы выполнить то, что я пытаюсь сделать:
Код 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");
Похоже, он ничего не делал, за исключением того, что при первом выполнении это дает очень странныйсимволы в качестве вывода, затем при последующих выполнениях, ничего.