- PR -

ASP.NETでASPEXECのように(他アプリ起動)出来ますか

投稿者投稿内容
ガギグ
会議室デビュー日: 2002/01/18
投稿数: 11
投稿日時: 2002-10-21 14:08
皆様レスありがとうございます。

クライアントPCでなく、サーバーPC(!)でWinFormアプリを起動したいのです。
(サーバPCでのWinFormアプリ起動をWEBサービス経由でクライアントから行なう)

OBJECTタグを用いる方法は、クライアント側での起動(ですよね?)なので
意図しているものとは異なります。

すでに別の手段での実装を行ないつつありますが、この現象(WinFormアプリが表示されない)について、何かご存知であればアドバイスお願いします。
(ここらへん理解するためにはアプリケーションドメインとか、あらたに学習しないと駄目なのかなぁ・・・)
NothingButXMLInfoSet
大ベテラン
会議室デビュー日: 2002/07/16
投稿数: 116
投稿日時: 2002-10-21 15:00
ガタさんの件への返答です。

引用:

ガタさんの書き込み (2002-10-21 14:08) より:
クライアントPCでなく、サーバーPC(!)でWinFormアプリを起動したいのです。
(サーバPCでのWinFormアプリ起動をWEBサービス経由でクライアントから行なう)

すでに別の手段での実装を行ないつつありますが、この現象(WinFormアプリが表示されない)について、何かご存知であればアドバイスお願いします。


先に原因と情報源を。原因は、おそらくaspnet_wp.exeが可視のデスクトップ上で動作していないからです。Windowsには可視のデスクトップは1つしかありません(Winsta0\default)。そこに作成されていないプロセスは、可視のウィンドウを表示できません。

引用:

(ここらへん理解するためにはアプリケーションドメインとか、あらたに学習しないと駄目なのかなぁ・・・)


この問題はWindowsの問題であって.NET Frameworkの問題ではありません。したがって、学習するならWindowsの仕組みを学習する必要があります。おそらく一次情報源はPlatform SDKになるでしょう。また、過去のMSJにもいくつか記事がありました。英語版はオンラインで読めます。日本語版にも翻訳されているはずです。ただし日本語版は紙媒体しかありませんけど。
http://www.microsoft.com/msj/0398/service2.htm
http://www.microsoft.com/msj/0599/security/security0599.htm

ただし、最近の「Seurity Push」によって、これらの機能は使えなくなる可能性が出てきました。
http://www.microsoft.com/japan/msdn/columns/secure/secure08192002.asp

というわけで、サービスプロセスからデスクトップを操作するのは諦めたほうがいいでしょう。第一、サーバーのデスクトップにはそもそもインタラクティブユーザーが存在するかどうかわからないので、ウィンドウを表示すること自体が無意味です。

もし何らかの理由で24/7で人間がサーバーコンソールを注視しているという条件が整っているのであれば、その人間がフォームアプリケーションを起動して、そのフォームでTCPポートあたりを開いて監視し、サービスプロセスは必要に応じてそのTCPポートにデータを投げ込むようにすれば単純に作れそうです。この方法で困る理由が私には思い浮かびません。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2002-10-21 18:02
引用:

ガタさんの書き込み (2002-10-21 14:08) より:

クライアントPCでなく、サーバーPC(!)でWinFormアプリを起動したいのです。
(サーバPCでのWinFormアプリ起動をWEBサービス経由でクライアントから行なう)


 それは逆では?「サーバ」は「仕えるもの」の意で、「クライアント(依頼者)」に対して何かを提供するのが役目です。そのため、GUIとかの「ユーザに仕えてもらう(データを提供してもらう)仕組み」は必要がないように設計するのが普通の方法です。なぜなら、サーバの前には必ずしも人がいるわけではないからです。人がいないときに人に入力や注意を呼びかけるGUIが出ても、仕方ないですよね?

 もし、「いや、うちのところでは××さんが日常的に使っているマシンがサーバになっていて、そこに表示したいんだ」というのであれば、それは運用方法を変えることをおすすめします。サーバには負荷が集中するので、よけいな負荷(個人の業務)をかけないようにするのが一般的な運用です。普通、サーバが止まると一般業務が停止するので、サーバが止まる要因は極力排除しなければなりません。

 エクスクラメーションをお付けなので、ご存じだとは思いますが…

 ところで、ログオフしているときには、Windowsフォームは表示できないと思いますが?
ガギグ
会議室デビュー日: 2002/01/18
投稿数: 11
投稿日時: 2002-10-23 11:00
NothingBut.NETFX様、Jitta様、ありがとうございます。

サーバーPC上のWinFormアプリは非表示で起動、TCPポートを監視。
WEBサービスがTCPポートに電文を投げ込み、電文を受信したWinFormアプリは自身を表示。
この方法をもって
「クライアントPCからWEBサービス経由でサーバPC上でのWinFormアプリ起動」
としました。

ガギグ
会議室デビュー日: 2002/01/18
投稿数: 11
投稿日時: 2002-11-09 00:19
直接プライベートメッセージを頂きましたので、こちらにも返事を貼り付けておきます。

--------------------------------------

私が実現したかったのは・・・
・端末AのローカルHDDに格納されたWinForm-EXEを端末Aの上で実行する。
・ただし、WinForm-EXEの起動は端末Bから指示する。
です。

NothingBut.NETFX様がレス付けてくださったとおり、
「サービスプロセスからデスクトップを操作するのは諦めたほうがよい」ので、
次のような別手段を採用して「逃げた」わけです。

・スタートアップにショートカットを入れておき端末AでWinForm-EXEを起動しておく。
 (端末Aではユーザーがログオンしてデスクトップが表示されています)
 (WinForm-EXEは非表示にします)
・このWinForm-EXEではTcpListenerを使って電文の到着を待ちます。
 (UIスレッドとは別に電文を待ち受けるスレッドを作成します)
・端末B上で動くプログラムから端末Aで動作中のWebServiceを呼び出します。
・端末Aで動作中のWebServiceはTcpClientを用いてWinForm-EXEに電文を
 送信します。
・電文を送信したWinForm-EXEは自分自身を表示します。

以上、これら回りくどい手順で端末Bから端末A上のプログラムを起動したように
「見せかけ」ました。

「起動はWebService経由で行う」と別の人間が決めたのでWebSercieの利用に
こだわっていますが、端末Bのプログラムから端末AのWinForm-EXEに
「直接」電文を投げれば済む話です。┐(´ー`)┌
シェリー
会議室デビュー日: 2002/11/06
投稿数: 2
投稿日時: 2002-11-12 16:11
ガタさん、レスありがとうございます。
詳細に書いていただいて大変助かりました。
試行錯誤で対処法を考え出すヒントになっています。
ありがとうございました。

返事が送れて申し訳ないです。

スキルアップ/キャリアアップ(JOB@IT)