はじめまして。jacoと申します。
C言語にはあまり関係ないかもしれませんが
どのような所で質問したらいいか分からない
ので失礼させていただきます。
VisualC 6.0、MFCの環境で、Winsockを使用
した簡単なHTTPサーバーを製作中なのですが、
Perlを実行するCGIの機能を実装しようと
思っているのですがやり方が分かりません。
PerlCGIは、標準入力から環境変数などを読み込み、
標準出力へ書き出すと思うのですが、
VCから標準入出力へのアクセス方法、またはPerl
とのやり取りの方法がまったく分からないのです。
どなたか、ご教授お願いいたします。
CreateProcessでPerlプロセスを起動する際に、
標準入出力を指定できます。
これに、パイプのハンドルを指定することにより、
作成したプロセスの入出力にアクセスできます。
CreateProcess, CreatePipeあたりがキーワードです。
ご回答ありがとうございます。
さっそく以下のようなプログラムを作ってみたのですが、うまく動きません。
//-----------------------------------------
HANDLE PerlStdOutRead;
HANDLE PerlStdOutWrite;
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput = PerlStdOutRead;
si.hStdOutput = PerlStdOutWrite;
si.hStdError = GetStdHandle(STD_ERROR_HANDLE);
CreatePipe(&PerlStdOutRead, &PerlStdOutWrite, &sa, 0);
CreateProcess(NULL, PerlPath, NULL, NULL, TRUE, 0, NULL, NULL, &si, &p);
while(ReadFile(PerlStdOutRead, buffer, 500, &nread, NULL)){
AfxMessageBox(buffer);
}
//----------------------------------------
戻り値を見る限り、
CreatePipe、CreateProcessは成功しているようなのですが。
ReadFileでフリーズしてしまいます。
きっとパイプの使い方が間違っているのだと思うのですが、
情けない事に自分では間違いを直せません。
よろしければ今一度ご教授願えないものでしょうか。
(1)
> si.hStdOutput = PerlStdOutWrite;
> CreatePipe(&PerlStdOutRead, &PerlStdOutWrite, &sa, 0);
si.hStdOutputに未初期化の値を設定した後に、
PerlStdOutWriteにパイプハンドルを割り当てています。
つまり、si.hStdOutputには無効な値が入ったままです。
(2)
> si.hStdInput = PerlStdOutRead;
> si.hStdOutput = PerlStdOutWrite;
パイプの2つのハンドルはデータの出口と入口です。
これでは、相手の出力端子と入力端子をつないだ状態です。
双方向通信するには、相手の出力と自分の入力、および
相手の入力と自分の出力をつなぐ2本のパイプが必要です。
(3)
相手に渡したハンドルは、
こちらでは使わないのですぐに閉じる必要があります。
どうもありがとうございました!
ようやく目的の処理が出来ました。
パイプ…なるほど。考え方が根本的に
間違ってましたね。というか混乱してました。
汚いプログラムで申し訳なかったです。
ホントにありがとうございました。
解決チェックを…