た処理を実行し、文字列として出力を返すためには、内からのVisual Studioで2010のCreateProcessとCreatePipe VC++
をC++/CLRのフォームアプリケーション私のWindowsフォームアプリケーション私は子プロセス(コンソールアプリケーション)を実行し、Windowsフォームアプリケーション内でstd::string
、std::wstring
、またはSystem::String^
のように出力を返します。さらに、私は、新しく作成された子プロセスにウィンドウを生成させたくありません。
コンソールアプリケーションは自分で作成したものですから、そのソースも制御できます。
私は次の例を見てきましたが、私は私が何をしようとしています何を達成するためにコードを変更する方法を理解していない:
MSDNコードは2つのコンソールアプリケーションとして記述されており、一方は他方を呼び出すように見えます。コードが私に混乱しています。私はC++で約4ヶ月しか働いていないので、まだすべてを理解していません。それは、私がする必要のないテキストファイルを参照するように見えます。
MSDNの200行以上のコードまたはkguiの300行以上のコードより簡単な方法がありますか?
回答hereは役に立ちましたが、単純すぎます。私は、基本的なソースの例(複雑なコードの何百もの行を必要としないものが望ましい)を見たいと思っていました。私はMFCコードを使用していただろうが、私はそれを私の目的に適合させるのが難しかった(私はMFCを使用していない)。続き
は、コードプロジェクトからのコードの私の適応である:私は私のWindowsフォームアプリケーション内からこれを使って試してみました
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;
}
、それはOKコンパイルし、エラーが発生することはありませんが、それはdoesnのどちらもうまくいくようです。なぜ私は考えていない。
これは私が上記のコードを実行する方法されています
std::string ping = ExecuteExternalFile("ping.exe", "127.0.0.1");
をその後の実行で、出力として非常に奇妙な3つの文字を与える最初の実行上の点を除いて、何かをするようには見えませんでした、何もない。
あなたはそれを難しいやり方にしていますが、その理由はわかりません。代わりにProcessStartInfo :: RedirectStandardOutputプロパティを使用してください。 –
"代わりにProcessStartInfo :: RedirectStandardOutputプロパティを使用してください。"あなたはもっと具体的に何を意味するのかを教えてください。たぶん、例へのリンクを提供しますか? – Jason
Googleのクエリにコピー/パスタ。最初のヒットを取る、それは良いものです。 –