- PR -

ノータッチデプロイメント(WinアプリからのEXEキックの件)

投稿者投稿内容
だい
常連さん
会議室デビュー日: 2004/08/03
投稿数: 22
投稿日時: 2004-08-03 13:55
WebフォームからWinアプリのEXEを呼び出した後にIISにあるEXEを
呼び出されたWinアプリから呼び出す事って可能でしょうか?

現在作成しているものは
IE6.0_VB.NETのASP/WebアプリとWinアプリにて作成

1.ログイン画面をWebアプリで作成
    ↓
2・メニュー画面をWinアプリにて作成
    ↓
3.サブメニュー画面をWinアプリにて作成

上記の1から2のWinアプリを呼び出すのに
Response.Redirect又はServer.Transferを使って
IIS上のEXEを呼び出しています。

これと同じ動きを2から3でのWinアプリで実現したいのですが
なにか方法わかりません。

サーバサイドのEXEを呼び出す方法が分からず
現状Reflectionを使用してオブジェクト変数に格納して
Showメソッドで呼び出しは可能ですが
プロセス状態が取得できず二重起動防止もできなくて
困ってます。

どなたか似たような動きができる実装した方
ご教授お願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-03 19:04
 全部まとめて1つのexeになるようにした方がいいのでは?

・なぜ、複数のEXEにしなければならないのか
・なぜ、ログインだけWebフォームなのか
・なぜ、わざわざ難しいように考えるのか
だい
常連さん
会議室デビュー日: 2004/08/03
投稿数: 22
投稿日時: 2004-08-03 20:03

引用
--------------------------------------------------
・なぜ、複数のEXEにしなければならないのか
・なぜ、ログインだけWebフォームなのか
・なぜ、わざわざ難しいように考えるのか
--------------------------------------------------

説明不足ですいません。

現在作成しているシステムで
ノータッチデプロイメントを使用して
メンテナンスもすべてサーバで行う方針です。

複数のEXEにしているのは一つのEXEでまとめてしまうには
あまりにも画面数が多い為です。
サーバサイドにあるEXEをキックする形にしてレスポンスを
維持しようとしています。
WebからダウンロードしてWinアプリを呼ぶ
ノータッチデプロイメントを使用しているのも
メンテナンスとレスポンスを考えての事らしいです。
更新もサーバの更新のみで処理できるので。





きよの
常連さん
会議室デビュー日: 2004/02/07
投稿数: 34
投稿日時: 2004-08-03 20:45
引用:

だいさんの書き込み (2004-08-03 20:03) より:
複数のEXEにしているのは一つのEXEでまとめてしまうには
あまりにも画面数が多い為です。
サーバサイドにあるEXEをキックする形にしてレスポンスを
維持しようとしています。



そういうことでしたら、EXEを1つと複数の DLL にすればいいと思います。
DLL は必要になるまでダウンロードされないので、適切に複数の DLL に分割すれば細い回線を利用していたとしても、それなりに快適なレスポンスが期待できます。
だい
常連さん
会議室デビュー日: 2004/08/03
投稿数: 22
投稿日時: 2004-08-03 21:07
きよのさん。ご返答ありがとうございます。

DLLだとプロセスが参照できなくて二重起動防止
したりだとかができなくて困っています。
なので直接EXEをキックできないかなぁと思ってます。

その辺の解決方法をご教授いただけないでしょうか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-04 09:00
引用:

だいさんの書き込み (2004-08-03 21:07) より:

DLLだとプロセスが参照できなくて二重起動防止
したりだとかができなくて困っています。
なので直接EXEをキックできないかなぁと思ってます。

その辺の解決方法をご教授いただけないでしょうか?


 DLLを単体でダブルクリックなりなんなりしても起動できず、実行ファイルからDLL内のオブジェクトを実体化しなければ(または関数をコールしなければ)なりません。したがって、呼び出す側が複数起動しないように適切に制御すれば、二重起動だろうが三重起動だろうが、どんな風にでも制御できます。

 具体的な方法はこちら
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13612&forum=7&14


 複数のDLLに分けると、DLLが更新されていないかどうかのチェックを毎回行います。したがって、小さいけれどもたくさんのリクエストが流れることになります。
 EXEを1つにすると、最初のロードはやたら重いけれども、1つのEXEの更新をチェックするだけなので、リクエストは少なくなります。

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-08-04 09:03 ]
だい
常連さん
会議室デビュー日: 2004/08/03
投稿数: 22
投稿日時: 2004-08-04 09:33
おはようございますJittaさん。
ご返答ありがとうございます。


[引用]
-------------------------------------------------------------------------------
Jittaさんの書き込み (2004-08-04 09:00) より:

 DLLを単体でダブルクリックなりなんなりしても起動できず、実行ファイルからDLL内のオブジェクトを実体化しなければ(または関数をコールしなければ)なりません。したがって、呼び出す側が複数起動しないように適切に制御すれば、二重起動だろうが三重起動だろうが、どんな風にでも制御できます。

 具体的な方法はこちら
http://quick-tips.hp.infoseek.co.jp/vs.net/sample/index.html

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

こちらの作業環境はVB.NETの為
こちらのC#のサンプルを確認できませんでした。
もしよろしければ上記の内容のご教授をいただけると
助かります。

ご迷惑をおかけして申し訳ありません。

上記内容を実装して確認した上で下記の内容部分の件も
含めまして上司に開発の方向性の相談をしたいと
思っております。

ご提案までしていただいて本当にありがとうございます。


[引用]
-------------------------------------------------------------------------------
複数のDLLに分けると、DLLが更新されていないかどうかのチェックを毎回行います。
したがって、小さいけれどもたくさんのリクエストが流れることになります。
 EXEを1つにすると、最初のロードはやたら重いけれども、1つのEXEの更新をチェックするだけなので、リクエストは少なくなります。
--------------------------------------------------------------------------------

 


[ メッセージ編集済み 編集者: だい 編集日時 2004-08-04 09:36 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-04 09:57
引用:

だいさんの書き込み (2004-08-04 09:33) より:

こちらの作業環境はVB.NETの為
こちらのC#のサンプルを確認できませんでした。
もしよろしければ上記の内容のご教授をいただけると
助かります。


 え〜っと、この会議室内のスレッドにリンクを張っていたはずですが・・・
 サンプルはソースも付いているので、ソースを読めば、ある程度わかると思うのですケド…

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=13612&forum=7&14
引用:

2004-08-03 16:34
 まず、プログラムメニューからの起動ですが、ここは「単数表示」ボタンのようなことをします。プログラムメニューフォームが、「各マスタの検索画面」のインスタンスを格納する変数を持ち、それがNULLかどうかによって、新規インスタンスを作成するかどうかを決めます。インスタンスを作成した際、closedイベントハンドラを登録し、インスタンス格納変数をnullクリアすることを忘れてはいけません。


Form1.cs region "button2" 285行目から324行目
コード:

#region "button2"
/// <summary>
/// button2で表示する為に必要
/// </summary>
private ClassLibrary1.Form1 ChildForm1 = null;
/// <summary>
/// ClassLibrary1.Form1を表示させる
/// buttn1と違い、1つだけしか表示させない
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button2_Click(object sender, System.EventArgs e) {
if (ChildForm1 == null) {
// 子フォームを表示する
ChildForm1 = new ClassLibrary1.Form1();
ChildForm1.Closed +=new EventHandler(ChildFrom1_Closed);
// 子フォームへデータを渡すには、子フォームにアクセス可能なプロパティを設定しておく
ChildForm1.Text = @"button2から表示された";
ChildForm1.Show();
} else {
// 子フォームを前面に出す
ChildForm1.Focus();
}
}

/// <summary>
/// button2で表示させた子フォームが閉じたときに発生するイベント
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ChildFrom1_Closed(object sender, EventArgs e) {
// 念のため、Disposeする
// ・・・と思ったが、イベントが呼び出されているときはインスタンスはまだ使用中なので
// Disposeするのはまずい?
// ChildForm1.Dispose();
// 次の呼び出しの為に初期化する
ChildForm1 = null;
}
#endregion


 ChildForm1を、表示済みフラグ兼インスタンス変数格納場所とします。この変数がnullの場合は、インスタンスを作成し、VB.NETならAddEventHandlerで、Closeイベントのハンドラを登録します。Closeイベントハンドラが呼ばれたということは、フォームが閉じたということなので、Closeイベントハンドラ内でChildForm1をnullクリアします。
 ChildForm1がnullでないときは、インスタンスの作成はせずに、Focusメソッドでフォーカスを与えています。

補足:
シングルトンパターンはこれ
http://homepage3.nifty.com/dotnetfan/win/windows12.html
(小野@どっとねっとふぁん さんのページ)

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-08-04 11:39 ]

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