我試圖使用CreateProcess
和CreatePipe
從Windows中執行過程形成在Visual Studio C++/CLR應用2010的CreateProcess和CreatePipe執行過程並返回輸出作爲VC字符串++
從內我的Windows窗體應用程序我想要執行子進程(控制檯應用程序),並在Windows窗體應用程序中將輸出作爲std::string
,std::wstring
或System::String^
返回。另外,我不希望新創建的子進程產生一個窗口。
控制檯應用程序是我自己創建的,所以我也可以控制它的源代碼。
我已經看到了下面的例子,但我不明白如何修改代碼來完成我想做的事:
MSDN代碼似乎寫成兩個控制檯應用程序,一個調用另一個。代碼讓我感到困惑。我只用C++工作了大約4個月,所以我仍然不瞭解所有的東西。它似乎引用了一個文本文件,我不需要這樣做。
有沒有比MSDN的200多行代碼或kgui的300多行代碼更簡單的方法?
答案here很有幫助,但過於簡單。我希望看到一個基本的源代碼示例(不涉及數百行復雜代碼將是更可取的)。我會用MFC的代碼,但我很難適應我的目的(我不使用MFC)。
以下是我從代碼項目代碼的適應性:
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窗體應用程序中嘗試從,而它編譯OK,不會引起任何錯誤,這不是」 t似乎也工作。我不知道爲什麼。
這是我如何執行上面的代碼:
std::string ping = ExecuteExternalFile("ping.exe", "127.0.0.1");
它似乎沒有做任何事情,只是在第一次執行它給人一種很奇怪3個字符作爲輸出,然後在後續執行,沒有。
你這樣做很難,不知道爲什麼。改用ProcessStartInfo :: RedirectStandardOutput屬性。 「 – 2011-12-17 22:11:01
」改爲使用ProcessStartInfo :: RedirectStandardOutput屬性。「你能否詳細解釋一下你的意思?也許提供一個例子的鏈接? – Jason 2011-12-17 22:45:14
複製/麪食到谷歌查詢。採取第一擊,這是一個很好的。 – 2011-12-17 23:14:15