
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件)
- 最新から表示
- 回答順に表示
No.4
- 回答日時:
ディスクトップ→デスクトップですね。
失礼しました。他の方も説明されていますが、
Apacheから呼び出されるCGIに関しては、
CUIのツールなら、システムコールの手法で、標準入力や標準出力を
Apacheへパイプすることが簡単にできるので、
CUIの出力結果をブラウザに出すことができます。
しかし、GUIのツールに関してはWindowsであればWindowsのAPIを使って
実行しているコンピュータへのグラフィック出力やマウスイベント取り出しなどに引き渡されるので、
ブラウザへ出力を引き渡すためには、それをそのまま、ラッパーして、
グラフィック命令から画面のサイズや作画命令に依存しない汎用的なコマンドに変換し、
それをブラウザ上で組み立てるか、
一旦仮想グラフィック画面に出力しておいて、それをビットストリームのイメージにして
ブラウザ上で動画再生させ、
ブラウザ上のマウスやキーボードの動きを仮想グラフィック画面に戻すといったイメージになると 予測されます。
前者の方法が、メタフレーム(WindowsServertとメタフレームサーバーとメタフレームに対応したGUIアプリ)
後者の方法が、リモートデスクトップであると、私は理解しております。
GUIの出力結果をwrapでCGIに戻し,そこで解読し欲しいものを組み立ててブラウザ画面に表示させるといった流れですね.丁寧なご説明どうもありがとうございます.
No.3
- 回答日時:
もうひとつ。
メタフレームという技術があります。
これもリモートデスクトップに近い形態ですね。したいことと若干方向が違うような感じもしますが考えてみます。多くの情報をいただいて勉強になりました。
No.2
- 回答日時:
ブラウザから、Windowsをリモート操作するツールがあるので、
それの利用ではどうでしょうか?
「ThinVNC」や「リモートディスクトップ」
ただ、一般公開してしまうと、触ってほしくないとこまで、触られてしまいますが。
機能限定させるために、独自開発するなら
GUIの出力や入力イベントをラップして、Apache経由でブラウザに引き渡すツールを作ることになりますが、
それに工数をかけるぐらいなら、同じことをやるCGIを作ったほうが、工数もシステムトラブルも小さくなると思われます。
No.1
- 回答日時:
厳しい言葉かもしれませんがCGIとはなにかを理解されていません。
また、HTTP、サーバ/クライアント、プラットホームに関する概念もすっぽり抜け落ちております。
ポイント、ポイントでの知識はおありのようですがそれらが線としてつながっていないのが誤解の原因です。
CGIは「サーバ側のプログラムを実行してその結果を標準出力でWebサーバに返す」仕組み
GUIプログラムは基本的にイベントドリブン型のプログラム(要はエンドレス)で、ユーザが外部デバイスからアクションを起こさない限りひらっきぱなし。
それが許されれば世のGUIを搭載したWebサーバは限界まで開かれたGUIアプリでパンクする危険性を常にはらむことになるでしょう。
ブラウザからサーバのGUIはコントロールする仕組みは今のところ無いのですから。
サーバ管理者がクライアントによってつぎからつぎへと開かれる電卓を永遠に閉じ続ける作業を想像すると怖いものがあります。
ブラクラならぬサバクラって感じでしょうか?
ローカルで完結していようがなんだろうがWebサーバを介していれば内部的にはネットワーク経由で接続されているのです。
ブラウザがクライアントで、あなたのマシンがサーバです。
たまたま、同じマシン上なので「錯覚」を起こしているのです。
> この原因と対策がお分かりになる方、教えてください。
長い前置きでしたが
原因:あなたのCGIに対する過大評価と理解不足
対策:素直にCGIからの起動はあきらめて、ローカルプラットホーム上での開発を行う
険があったらすいません。
でも、馬を竹につないで竹馬を作ろうとするくらい(そこまでじゃないかも)ベクトルが異なるご質問でしたので・・・。
この回答への補足
早速の詳しいアドバイスをどうもありがとうございます。
おっしゃっていただいたことは理解の上で手段を探しています。
たとえば次の手段はきれいではなくタイムラグもありますが、「ブラクラならぬサバクラ」の抜け道を開くことなく私の目的を果たしてくれます。
「CGIはあるファイルにリクエストを書く。一方、コマンドプロンプトなど別のGUIプログラム配下でプログラムを常時走らせておき、一定時間おきにsleepが解けてリクエストがないかチェックする。もしリクエストが届いていれば、解読してチェックし実行する。これによりブラウザとそのGUIプログラム以外に新しくウィンドウが立ち上がって、リクエストされたプログラムが実行される。」
これを作れば確実に動きます。
けれども、もっときれいでタイムラグのない方法が欲しいのです。
Apacheのconf設定位では可能にならないとすれば、たとえば
・pipeを使ってタイムラグをなくす方法や、
・Windowsの "サービス" 形態のプログラムを作ることで、GUIプログラムを常時走らせておく必要をなくすという方法
・その他の方法
があれば具体的に教えてください。
もしさんざん調べて作ってダメだとダメージが大きいので。
私が最初にここまで詳しく書けばよかったですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
IISでエラー、Apachでは動くの...
-
EXCELファイルに誰がアクセスし...
-
FTPにて553エラー
-
MT/カスタムフィールドでのPDF...
-
VBAでサーバーにアクセスするに...
-
httpd の1.42pで表示出来ないCG...
-
CGIでソースがそのままでてしま...
-
.cgi拡張子のままCGIファイルを...
-
動的URLから静的URLへのリダイ...
-
IISのSSIの設定について
-
ファイルダウンロード後に、デ...
-
サーバー間でファイルコピーしたい
-
表示画面が真っ白になる場合、...
-
ユーザの所属するグループを取...
-
ApacheでのCGIについての質問
-
HTML文書の中で環境変数を使う...
-
FFFTPでアップロードできない?
-
WIn32API ディレクトリ内ファイ...
-
通貨表示で3桁毎にカンマ(?)を...
-
KENT WEB(昨日の続きです)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
cgi を定期的に自動実行
-
csvエディター
-
CGIのちょっとしたこと
-
Webからアクセスし、画面のボタ...
-
Perlプログラム上でアラートを表示
-
iアプリのダウンロード回数のカ...
-
PHPとcgiの違い
-
C言語のCGIはプロパイダに聞か...
-
cgiで呼び出したプログラムを数...
-
実行可能な外部コマンドは?
-
PerlとCで相互に通信をさせたい
-
ホームページにCGIを設置したの...
-
http://www.***.com/***/***.cg...
-
おかしなif文だと思うのですが...
-
インターネット通信
-
CGIって何ですか?簡潔に教えて...
-
reuire 先に引数が渡ってしまう
-
perlによる外部プログラムの実行
-
IISでエラー、Apachでは動くの...
-
EXCELファイルに誰がアクセスし...
おすすめ情報