• 締切済み

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

CGIからGUIプログラムを立ち上げたい(Windows) Windows XP SP2パソコン上で、自分のマシン上でファイルを閲覧したりプログラムを起動・制御するユーザインタフェースをブラウザにしようと、Apache/2.2.4(Win32)でローカルにhttpdを立ち上げています。 ブラウザ表示文書からCGIとして呼び出されたPerl(ActivePerl 5.005_03)プログラムが、system関数や``記法で外部のプログラムを実行することができますね。 ところが、起動した外部プログラムがウィンドウを開いてユーザと対話する種類のプログラム、つまりGUIプログラムの場合に限って、ウィンドウが開いてくれないので、したいことができません。 この原因と対策がお分かりになる方、教えてください。 (たとえば単純化のためにWindowsの電卓プログラムcalc.exeを起動してもウィンドウが出てくれません。 PowerShellスクリプト経由にしても元がブラウザだという情報が波及するらしくウィンドウが立ち上がりません。)

  • CGI
  • 回答数4
  • ありがとう数10

みんなの回答

回答No.4

ディスクトップ→デスクトップですね。失礼しました。 他の方も説明されていますが、 Apacheから呼び出されるCGIに関しては、 CUIのツールなら、システムコールの手法で、標準入力や標準出力を Apacheへパイプすることが簡単にできるので、 CUIの出力結果をブラウザに出すことができます。 しかし、GUIのツールに関してはWindowsであればWindowsのAPIを使って 実行しているコンピュータへのグラフィック出力やマウスイベント取り出しなどに引き渡されるので、 ブラウザへ出力を引き渡すためには、それをそのまま、ラッパーして、 グラフィック命令から画面のサイズや作画命令に依存しない汎用的なコマンドに変換し、 それをブラウザ上で組み立てるか、 一旦仮想グラフィック画面に出力しておいて、それをビットストリームのイメージにして ブラウザ上で動画再生させ、 ブラウザ上のマウスやキーボードの動きを仮想グラフィック画面に戻すといったイメージになると 予測されます。 前者の方法が、メタフレーム(WindowsServertとメタフレームサーバーとメタフレームに対応したGUIアプリ) 後者の方法が、リモートデスクトップであると、私は理解しております。

moregreen
質問者

お礼

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

回答No.3

もうひとつ。 メタフレームという技術があります。

moregreen
質問者

お礼

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

回答No.2

ブラウザから、Windowsをリモート操作するツールがあるので、 それの利用ではどうでしょうか? 「ThinVNC」や「リモートディスクトップ」 ただ、一般公開してしまうと、触ってほしくないとこまで、触られてしまいますが。 機能限定させるために、独自開発するなら GUIの出力や入力イベントをラップして、Apache経由でブラウザに引き渡すツールを作ることになりますが、 それに工数をかけるぐらいなら、同じことをやるCGIを作ったほうが、工数もシステムトラブルも小さくなると思われます。

moregreen
質問者

お礼

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

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.1

厳しい言葉かもしれませんがCGIとはなにかを理解されていません。 また、HTTP、サーバ/クライアント、プラットホームに関する概念もすっぽり抜け落ちております。 ポイント、ポイントでの知識はおありのようですがそれらが線としてつながっていないのが誤解の原因です。 CGIは「サーバ側のプログラムを実行してその結果を標準出力でWebサーバに返す」仕組み GUIプログラムは基本的にイベントドリブン型のプログラム(要はエンドレス)で、ユーザが外部デバイスからアクションを起こさない限りひらっきぱなし。 それが許されれば世のGUIを搭載したWebサーバは限界まで開かれたGUIアプリでパンクする危険性を常にはらむことになるでしょう。 ブラウザからサーバのGUIはコントロールする仕組みは今のところ無いのですから。 サーバ管理者がクライアントによってつぎからつぎへと開かれる電卓を永遠に閉じ続ける作業を想像すると怖いものがあります。 ブラクラならぬサバクラって感じでしょうか? ローカルで完結していようがなんだろうがWebサーバを介していれば内部的にはネットワーク経由で接続されているのです。 ブラウザがクライアントで、あなたのマシンがサーバです。 たまたま、同じマシン上なので「錯覚」を起こしているのです。 > この原因と対策がお分かりになる方、教えてください。 長い前置きでしたが 原因:あなたのCGIに対する過大評価と理解不足 対策:素直にCGIからの起動はあきらめて、ローカルプラットホーム上での開発を行う 険があったらすいません。 でも、馬を竹につないで竹馬を作ろうとするくらい(そこまでじゃないかも)ベクトルが異なるご質問でしたので・・・。

moregreen
質問者

補足

早速の詳しいアドバイスをどうもありがとうございます。 おっしゃっていただいたことは理解の上で手段を探しています。 たとえば次の手段はきれいではなくタイムラグもありますが、「ブラクラならぬサバクラ」の抜け道を開くことなく私の目的を果たしてくれます。 「CGIはあるファイルにリクエストを書く。一方、コマンドプロンプトなど別のGUIプログラム配下でプログラムを常時走らせておき、一定時間おきにsleepが解けてリクエストがないかチェックする。もしリクエストが届いていれば、解読してチェックし実行する。これによりブラウザとそのGUIプログラム以外に新しくウィンドウが立ち上がって、リクエストされたプログラムが実行される。」 これを作れば確実に動きます。 けれども、もっときれいでタイムラグのない方法が欲しいのです。 Apacheのconf設定位では可能にならないとすれば、たとえば ・pipeを使ってタイムラグをなくす方法や、 ・Windowsの "サービス" 形態のプログラムを作ることで、GUIプログラムを常時走らせておく必要をなくすという方法 ・その他の方法 があれば具体的に教えてください。 もしさんざん調べて作ってダメだとダメージが大きいので。 私が最初にここまで詳しく書けばよかったですね。

関連するQ&A

  • 他のプログラムの呼び方について

    GUIのプログラムと(Gui.exe)、計算をするプログラム(Calc.exe)がありまして、 GUIのプログラムからパラメータを入力し、そのパラメータにしたがって計算をするんですが、Gui.exeからCalc.exeを呼ぶにはどのようにすればいいんでしょうか? 2つのプログラムを同じディレクトリにおいて、system("Calc.exe hoge1 hoge2")のようにすればいいのかな、思ったのですが、どうもだめなようです。Calc.exeのパスを指定すればいいようなのですが、どのように指定すればいいかわかりません。 また、今は2つのexeファイルがあるのですが、これを一つのexeファイルにまとめるようなことって出来るのでしょうか? 開発環境はVC++6.0,Windows XPです。

  • バックグラウンドでGUIプログラムが止まる。

    WindowsのタスクスケジューラでOS起動時にプログラムを起動させました。 ログインしなくても動作して欲しいので、OS起動時にしています。 しばらくは動作したあと止まってしまっている様です。 GUIのプログラムではあるのですが、動作時にメッセージを頻繁にテキストボックスに対し表示しております。ただ、バックグラウンドなので表示は見えません。 表示を行うためのメッセージキューが一杯になって止まってしまうのか?とも思ったのですが、対処の方法が思い浮かばず、何か良い手は無い物でしょうか? 普通にログイン後にGUIプログラムを起動させて動かしている分には問題なく動作している様に見受けられます。

  • CGIとは結局何なのでしょうか。

    CGIの流れというものについて勉強したところ、 サーバがユーザから要求を受けて、 そしてCGIという決まりに従って 外部プログラムを起動し、結果を返してもらい、 またユーザに返す。というものらしいですが… では、結局のところ、CGIという決まりは どういう決まりなのでしょうか。 どなたか教えていただけないでしょうか。

    • ベストアンサー
    • CGI
  • CGI作成ファイル所有者をEveryone等にしたい(Windows)

    CGI作成ファイル所有者をEveryone等にしたい(Windows) Windows XP SP2パソコン上で、ブラウザで自分のマシン上のファイルを閲覧したりプログラムを起動・制御しようと、Apache/2.2.4(Win32)でローカルにhttpdを立ち上げています。 ブラウザ表示文書からCGIとして呼び出されたPerl(ActivePerl 5.005_03)プログラムで、system関数からcygwinのcpコマンドを呼び出して、NTFSフォーマットされたCドライブ上で、ファイルAを新しく(既存の上書きでも同じ)ファイルBにコピーしました。 system("c:/cygwin/bin/cp -uf '$fr_file' '$to_file'"); という感じで、正常復帰してきます。 ところが、コピー先ファイルは、その所有者がSYSTEMになってできてしまいます。 こうなると、AdministratorsやEveryoneに属している自分では属性読み取り以外許されません。 いろいろなプログラムからそのファイルを開こうとしても削除しようとしても、エラーになってしまいます(ブラウザでApache経由だけは読めます)。 CGIで呼ばれたプログラムやそこから呼ばれるサブルーチンその他のソフトがどうファイルを操作しても、作られるファイルの所有者がEveryoneまたはAdministratorsになるようにする方法か、 そうでなくても誰からでも読み書き実行等フルコントロールがつくようにする方法は何かないでしょうか? この原因と対策がお分かりになる方、教えてください。 (chmod, chown, umask…全部関係ないですよね。Windows上で0777にしようとしても所有者が変わらないので状況は変わりません。Perlのstatでファイルを見るとuidもgidも0が返ってきます。) (Windowsのプロパティのセキュリティタブのところで所有者を変えてパーミッションを変える方法や、Windowsのcacls, icaclsコマンドを実行して所有者を変える方法も知っていますが、そんなことをせずに、ファイルができる前に包括的に対処したいのです。) (自分がSYSTEMに参加することもできないですよね。)

    • ベストアンサー
    • CGI
  • ローカルでのCGIの実行テストの方法を教えてください

    CGIをWindows Meで動作させたいのですが、とほほのWWW入門を見てみると、 ActivePerlとAn HTTPDのソフトを使うとかいてあり、 An HTTPDは雑誌のCD-ROMで入手したのですがActivePerlはありませんでした。 インターネットから入手するしかないのでしょうか?ダイアルアップ接続のため、 時間が掛かりそうだし、なかなかダウンロードする気になりません。 もし他にローカル環境でCGIの動作テストをする方法があれば教えてください。 またAn HTTPDのソフトだけではローカルでのCGIテストはできませんか? それと、とほほのWWW入門に「ActivePerlのオプションであるPerlScriptを インストールした人は、セキュリティに関して十分に注意し、レジストリの修正を 忘れないようにしてください。」と書いてありますが、これはどういう意味ですか? PerlScriptをインストールするのとしないのとではどう違うのですか? 教えてください。よろしくお願いします。

    • ベストアンサー
    • Perl
  • ローカル環境でのCGIエラー

    ActivePerlとAn HTTPdでWindowsXP HomeEditionのPC上でCGIを動かそうと思っています。 どちらも最新版をダウンロードしてインストールしました。 ActivePerlに関してはegフォルダ下のexample.plで動作確認が取れています。 An HTTPdに関してはhttp://127.0.0.1以下のURLを指定してページが表示されています。 ですが、htmlからcgiを呼び出そうとすると「ページを表示できません」「サーバーが見つからないか、DNS エラーです。」のエラーが出てしまいます。 試しにcgiファイルをフルパスで指定したのですが同じでした。 ちなみに、簡単なCGIプログラムtest.cgiを作成、サーバにアップして動作を確認しましたがローカルではエラーになります。 また、ローカルでコマンドプロンプトにて c:\usr\local\bin\perl c:\プログラムのパス\cgi-bin\test.cgi と入力すると内容を表示します。 コマンドプロンプトでCGIプログラムのあるcgi-binディレクトリに移動して perl -v と入力するとperlのバージョン情報を表示するので、パスは通っていると思われます。 Au HTTPdのerrors.logには Thu Aug 16 19:21:18 2007 Warning: CGI TerminateProcess 2500 error 5 とりあえず、自分で原因を絞れるであろうところはあたってみたつもりですが、何か見落としていることがあるでしょうか? もしかしたらAu HTTPdに問題があるでしょうか?

    • 締切済み
    • CGI
  • 外部プログラムの起動と監視

    イントラネット内のLinuxサーバにあるプログラムをクライアントPCのブラウザから 起動しそのプログラムが出力するログを一定周期でブラウザに表示して プログラム終了時にはユーザーに知らせたい。 また、プログラムは同時起動が不可能なものとしたい。 PHPなどのCGIスクリプトでは、ブラウザとのセッションが切れてしまえば サーバー側のプログラムは走りっぱなしになってしまいます。 外部プログラムの監視や排他制御を考えると非常に複雑な処理になることが 予想されます。 そこで質問なのですが、サーバーのプログラムの起動と監視をクライアントPCの ブラウザから行いたいのですがJavaの技術を使うことで容易になりますか? また、ブラウザを使わない通信プログラムを作成すれば可能となりますか? 詳しい方がいましたら教えて下さい。宜しくお願い致します。

    • ベストアンサー
    • Java
  • CGIのアクセス制限について

    環境は windowsXPHome SP3 / Apache2.2 / ActivePerl5 / (MySQLを使う予定) です。 htdocs\index.html htdocs\ddd\aaa.cgi htdocs\ddd\bbb.cgi のようなディレクトリ構成で、httpd.confは、htdocs以下を公開する設定になっていて <Directory "D:\Program Files\Apache Software Foundation\Apache2.2\htdocs\ddd"> AddHandler cgi-script .cgi Options +ExecCGI </Directory> を指定しました。 これを自宅サーバーとして公開する場合、外部からはindex.htmlにアクセスできるようにして、 aaa.cgiやbbb.cgiはindex.htmlからリンクやformのactionから呼び出されてからしか実行できない (直接cgiのurlを指定して開けない)ようにするにはどうすればいいでしょうか? よろしくお願いします。

    • ベストアンサー
    • CGI
  • Windows版ApacheでCGIやSSI

    初めまして、 Windows版Apache HTTP Server2.0を使用しています。 SSIやCGIを使用したいのです。 ActivePerlをC:/usr/localに導入しましたが、 httpd.confをどの様に修正すれば良いでしょうか? ご指導、お願い致しますm(_ _)m

  • WINDOWS9xでCGIの起動の方法

    CGIをダイアルアップして、サーバーにアクセスしていちいち確認してては、無駄な料金がかかってしまうので、 CGIをダイアルアップせずにWINDOWS98で起動したいのですが、 Activeperlと、http://www.st.rim.or.jp/~nakataにあるhttpdを使ったのですが、 うまく動作しません。。 他に良い方法や、そのインストール手順みたいなURLありましたら 教えてください。 お願いします

    • 締切済み
    • CGI

専門家に質問してみよう