PerlへCGIするには

[戻る]
jaco [E-Mail] 2002/07/16(火) 09:25:05
はじめまして。jacoと申します。
C言語にはあまり関係ないかもしれませんが
どのような所で質問したらいいか分からない
ので失礼させていただきます。
VisualC 6.0、MFCの環境で、Winsockを使用
した簡単なHTTPサーバーを製作中なのですが、
Perlを実行するCGIの機能を実装しようと
思っているのですがやり方が分かりません。
PerlCGIは、標準入力から環境変数などを読み込み、
標準出力へ書き出すと思うのですが、
VCから標準入出力へのアクセス方法、またはPerl
とのやり取りの方法がまったく分からないのです。
どなたか、ご教授お願いいたします。

dairygoods 2002/07/16(火) 12:47:34
CreateProcessでPerlプロセスを起動する際に、
標準入出力を指定できます。
これに、パイプのハンドルを指定することにより、
作成したプロセスの入出力にアクセスできます。

CreateProcess, CreatePipeあたりがキーワードです。

jaco [E-Mail] 2002/07/16(火) 19:59:38
ご回答ありがとうございます。
さっそく以下のようなプログラムを作ってみたのですが、うまく動きません。
//-----------------------------------------
  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でフリーズしてしまいます。
きっとパイプの使い方が間違っているのだと思うのですが、
情けない事に自分では間違いを直せません。
よろしければ今一度ご教授願えないものでしょうか。

dairygoods 2002/07/17(水) 11:04:59
(1)
>  si.hStdOutput = PerlStdOutWrite;
>  CreatePipe(&PerlStdOutRead, &PerlStdOutWrite, &sa, 0);

si.hStdOutputに未初期化の値を設定した後に、
PerlStdOutWriteにパイプハンドルを割り当てています。
つまり、si.hStdOutputには無効な値が入ったままです。

(2)
>  si.hStdInput = PerlStdOutRead;
>  si.hStdOutput = PerlStdOutWrite;
パイプの2つのハンドルはデータの出口と入口です。
これでは、相手の出力端子と入力端子をつないだ状態です。

双方向通信するには、相手の出力と自分の入力、および
相手の入力と自分の出力をつなぐ2本のパイプが必要です。

(3)
相手に渡したハンドルは、
こちらでは使わないのですぐに閉じる必要があります。

jaco [E-Mail] 2002/07/17(水) 19:10:58
どうもありがとうございました!
ようやく目的の処理が出来ました。
パイプ…なるほど。考え方が根本的に
間違ってましたね。というか混乱してました。

汚いプログラムで申し訳なかったです。
ホントにありがとうございました。

jaco [E-Mail] 2002/07/17(水) 19:11:53
[[解決]]
解決チェックを…

古いスレッドには追加発言できません。