CreateProcess を利用してリダイレクションの結果を取得したい – プログラミング – Home

CreateProcess を利用して...
 
通知
すべてクリア

CreateProcess を利用してリダイレクションの結果を取得したい


jima
 jima
(@jima)
ゲスト
結合: 20年前
投稿: 2
Topic starter  

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 );
}


引用解決済
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

解答ではないですが
>f_CreateProcess(C:\, C:\xxxx.exe > C:\Output.txt);
この指定の仕方で動きますか?
エスケープ文字があってうまくいきそうもないですが。。。


返信引用
孝仁
 孝仁
(@孝仁)
ゲスト
結合: 20年前
投稿: 3
 

すみません。これです。
f_CreateProcess(C:\\, C:\\xxxx.exe > C:\\Output.txt);


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

リダイレクトはコマンドプロンプトの機能ですから、
f_CreateProcess(C:\\, cmd.exe /c ~.exe > ファイル);
ではないでしょうか。


返信引用
jima
 jima
(@jima)
ゲスト
結合: 20年前
投稿: 2
Topic starter  

自分で調べた結果、直接は無理ということが分かりました。

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);
}


返信引用
各無し
 各無し
(@各無し)
ゲスト
結合: 20年前
投稿: 11
 

関係ないけど、GetBufferしたらReleaseBufferしようよ。

# ALGO ?


返信引用
ギャバ
 ギャバ
(@ギャバ)
ゲスト
結合: 20年前
投稿: 1
 

CommandErrorParam.GetBuffer( sizeof(CommandErrorParam) )
↑これなに?


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました