VC++6.0 MFC WindowsXP sp2
CreateProcess を利用してコマンドプロンプトを立ち上げ、”>”でリダイレクション
でファイルから結果を取得したいのですが、何故か結果が取得できません。
ファイルが作成されないのです。
本来ならば”C:\Output.txt”に結果が表示される
はずなのですが、上手くいきません。
知っている方がいれば教えていただけませんか?
// ここで呼ぶ
f_CreateProcess(C:\, C:\xxxx.exe > C:\Output.txt);
iPath:実行ファイルのディレクトリ
iCommandParam :コマンド引数
bool f_CreateProcess( CString iPath, CString iCommandParam ){
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
ZeroMemory( &pi, sizeof(pi) );
// コマンドプロンプトを非表示に設定する。
// 表示したい時は、これをコメント化する。
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
// 解凍 unzip aaa
// バッチファイルを実行する
if( !CreateProcess( NULL,
iCommandParam.GetBuffer
( sizeof(iCommandParam) ),// Command line.
NULL,
// Process handle not inheritable.
NULL,
// Thread handle not inheritable.
FALSE,
// Set handle inheritance to FALSE.
0,
// No creation flags.
NULL,
// Use parent's environment block.
iPath.GetBuffer( sizeof
(iPath) ),// Use parent's starting directory.
&si,
// Pointer to STARTUPINFO structure.
&pi )
// Pointer to PROCESS_INFORMATION structure.
)
{
return false;
}
// プログラム実行終了まで待機
CloseHandle( pi.hThread );
WaitForSingleObject( pi.hProcess, INFINITE );
// Close process and thread handles.
CloseHandle( pi.hProcess );
}
解答ではないですが
>f_CreateProcess(C:\, C:\xxxx.exe > C:\Output.txt);
この指定の仕方で動きますか?
エスケープ文字があってうまくいきそうもないですが。。。
すみません。これです。
f_CreateProcess(C:\\, C:\\xxxx.exe > C:\\Output.txt);
リダイレクトはコマンドプロンプトの機能ですから、
f_CreateProcess(C:\\, cmd.exe /c ~.exe > ファイル);
ではないでしょうか。
自分で調べた結果、直接は無理ということが分かりました。
http://homepage2.nifty.com/DSS/VCPP/API/CreateProcessRedirect.htm
http://numata.aquasky.jp/programming/vcpp/sys_001.cpp
これらを見て直したのですが、やっぱり上手くうごきません。
// ここで呼ぶ
Test( C:\\XXX\\CCC.exe);
void Test( CString iZipFileFullPath )
{
// 取得先ファイルの作成
SECURITY_ATTRIBUTES sa;
sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof
(SECURITY_ATTRIBUTES);
sa.bInheritHandle = TRUE; // 子プロセスへの継承を許可
HANDLE hFile = CreateFile( // ファイル名
C:\\XXXXX\\Debug\\TempDirectory\\Redirection.txt,
GENERIC_WRITE, // 書き込み用
FILE_SHARE_READ, // 競合プロセスは読取専用
&sa,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) {
cout << 取得先ファイルの作成に失敗. << endl;
exit(1);
}
// 標準出力の出力先を指定してアプリケーションを実行
STARTUPINFO si;
ZeroMemory(&si, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdOutput = hFile; // 標準出力
si.hStdError = hFile; // 標準エラー出力
PROCESS_INFORMATION pi;
BOOL ret = CreateProcess(
NULL,
//argv[1], // コマンド
//unzip -P qlc ddd,
CommandErrorParam.GetBuffer( sizeof(CommandErrorParam) ),
NULL, NULL,
TRUE, 0,
NULL,
//NULL,
C:\\HM\\CADExplorer\\Debug\\TempDirectory,
&si, &pi
);
if (!ret) {
cout << アプリケーションの実行に失敗. << endl;
CloseHandle(hFile);
exit(1);
}
// アプリケーションの終了を待つ
WaitForSingleObject(pi.hProcess, INFINITE);
// 子プロセス・ファイルを閉じる
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
CloseHandle(hFile);
}
関係ないけど、GetBufferしたらReleaseBufferしようよ。
# ALGO ?
CommandErrorParam.GetBuffer( sizeof(CommandErrorParam) )
↑これなに?