電子書籍の厳選無料作品が豊富!

CGIからGUIプログラムを立ち上げたい(Windows)

Windows XP SP2パソコン上で、自分のマシン上でファイルを閲覧したりプログラムを起動・制御するユーザインタフェースをブラウザにしようと、Apache/2.2.4(Win32)でローカルにhttpdを立ち上げています。

ブラウザ表示文書からCGIとして呼び出されたPerl(ActivePerl 5.005_03)プログラムが、system関数や``記法で外部のプログラムを実行することができますね。

ところが、起動した外部プログラムがウィンドウを開いてユーザと対話する種類のプログラム、つまりGUIプログラムの場合に限って、ウィンドウが開いてくれないので、したいことができません。

この原因と対策がお分かりになる方、教えてください。

(たとえば単純化のためにWindowsの電卓プログラムcalc.exeを起動してもウィンドウが出てくれません。
PowerShellスクリプト経由にしても元がブラウザだという情報が波及するらしくウィンドウが立ち上がりません。)

A 回答 (4件)

ディスクトップ→デスクトップですね。

失礼しました。

他の方も説明されていますが、
Apacheから呼び出されるCGIに関しては、
CUIのツールなら、システムコールの手法で、標準入力や標準出力を
Apacheへパイプすることが簡単にできるので、
CUIの出力結果をブラウザに出すことができます。


しかし、GUIのツールに関してはWindowsであればWindowsのAPIを使って
実行しているコンピュータへのグラフィック出力やマウスイベント取り出しなどに引き渡されるので、
ブラウザへ出力を引き渡すためには、それをそのまま、ラッパーして、
グラフィック命令から画面のサイズや作画命令に依存しない汎用的なコマンドに変換し、
それをブラウザ上で組み立てるか、

一旦仮想グラフィック画面に出力しておいて、それをビットストリームのイメージにして
ブラウザ上で動画再生させ、
ブラウザ上のマウスやキーボードの動きを仮想グラフィック画面に戻すといったイメージになると 予測されます。


前者の方法が、メタフレーム(WindowsServertとメタフレームサーバーとメタフレームに対応したGUIアプリ)
後者の方法が、リモートデスクトップであると、私は理解しております。
    • good
    • 0
この回答へのお礼

GUIの出力結果をwrapでCGIに戻し,そこで解読し欲しいものを組み立ててブラウザ画面に表示させるといった流れですね.丁寧なご説明どうもありがとうございます.

お礼日時:2010/08/26 12:12

もうひとつ。



メタフレームという技術があります。
    • good
    • 0
この回答へのお礼

これもリモートデスクトップに近い形態ですね。したいことと若干方向が違うような感じもしますが考えてみます。多くの情報をいただいて勉強になりました。

お礼日時:2010/08/26 02:57

ブラウザから、Windowsをリモート操作するツールがあるので、


それの利用ではどうでしょうか?
「ThinVNC」や「リモートディスクトップ」
ただ、一般公開してしまうと、触ってほしくないとこまで、触られてしまいますが。

機能限定させるために、独自開発するなら
GUIの出力や入力イベントをラップして、Apache経由でブラウザに引き渡すツールを作ることになりますが、
それに工数をかけるぐらいなら、同じことをやるCGIを作ったほうが、工数もシステムトラブルも小さくなると思われます。
    • good
    • 0
この回答へのお礼

したいことがリモートデスクトップ系でできるかどうか考えてみます。情報どうもありがとうございます。

お礼日時:2010/08/26 02:51

厳しい言葉かもしれませんがCGIとはなにかを理解されていません。


また、HTTP、サーバ/クライアント、プラットホームに関する概念もすっぽり抜け落ちております。
ポイント、ポイントでの知識はおありのようですがそれらが線としてつながっていないのが誤解の原因です。

CGIは「サーバ側のプログラムを実行してその結果を標準出力でWebサーバに返す」仕組み

GUIプログラムは基本的にイベントドリブン型のプログラム(要はエンドレス)で、ユーザが外部デバイスからアクションを起こさない限りひらっきぱなし。
それが許されれば世のGUIを搭載したWebサーバは限界まで開かれたGUIアプリでパンクする危険性を常にはらむことになるでしょう。
ブラウザからサーバのGUIはコントロールする仕組みは今のところ無いのですから。
サーバ管理者がクライアントによってつぎからつぎへと開かれる電卓を永遠に閉じ続ける作業を想像すると怖いものがあります。
ブラクラならぬサバクラって感じでしょうか?

ローカルで完結していようがなんだろうがWebサーバを介していれば内部的にはネットワーク経由で接続されているのです。
ブラウザがクライアントで、あなたのマシンがサーバです。
たまたま、同じマシン上なので「錯覚」を起こしているのです。

> この原因と対策がお分かりになる方、教えてください。
長い前置きでしたが
原因:あなたのCGIに対する過大評価と理解不足
対策:素直にCGIからの起動はあきらめて、ローカルプラットホーム上での開発を行う

険があったらすいません。
でも、馬を竹につないで竹馬を作ろうとするくらい(そこまでじゃないかも)ベクトルが異なるご質問でしたので・・・。

この回答への補足

早速の詳しいアドバイスをどうもありがとうございます。
おっしゃっていただいたことは理解の上で手段を探しています。
たとえば次の手段はきれいではなくタイムラグもありますが、「ブラクラならぬサバクラ」の抜け道を開くことなく私の目的を果たしてくれます。

「CGIはあるファイルにリクエストを書く。一方、コマンドプロンプトなど別のGUIプログラム配下でプログラムを常時走らせておき、一定時間おきにsleepが解けてリクエストがないかチェックする。もしリクエストが届いていれば、解読してチェックし実行する。これによりブラウザとそのGUIプログラム以外に新しくウィンドウが立ち上がって、リクエストされたプログラムが実行される。」

これを作れば確実に動きます。
けれども、もっときれいでタイムラグのない方法が欲しいのです。
Apacheのconf設定位では可能にならないとすれば、たとえば
・pipeを使ってタイムラグをなくす方法や、
・Windowsの "サービス" 形態のプログラムを作ることで、GUIプログラムを常時走らせておく必要をなくすという方法
・その他の方法
があれば具体的に教えてください。
もしさんざん調べて作ってダメだとダメージが大きいので。

私が最初にここまで詳しく書けばよかったですね。

補足日時:2010/08/25 13:58
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!