- PR -

Dll化したFormの2重起動をチェックするには?

投稿者投稿内容
gorisaku
ベテラン
会議室デビュー日: 2004/04/17
投稿数: 95
投稿日時: 2004-08-02 23:38
C#.Netで開発をしております。
共通で使用する検索画面をDll化し、プログラムを作成しましたが、
Dll化した物だと2重起動チェックが掛からなくなりました。
MutexでもProcessでも×でした。
もしかしたらDll化したものは2重起動のチェックが出来ないのでしょうか?
どなたかご教授願えたらと思います。
よろしくお願いいたします。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-08-03 00:10
引用:

gorisakuさんの書き込み (2004-08-02 23:38) より:
共通で使用する検索画面をDll化し、プログラムを作成しましたが、
Dll化した物だと2重起動チェックが掛からなくなりました。
MutexでもProcessでも×でした。
もしかしたらDll化したものは2重起動のチェックが出来ないのでしょうか?


もともとどのように2重起動チェックしていた物を、
どのようにDLL化したらだめになったんでしょうか?
それがわからないと想像がつきません。

あと、Processでの2重起動チェックってなんですか?
# あ、GetProcessesByNameだったかとかで探してってことですかね?
Izumi, Y.
ベテラン
会議室デビュー日: 2002/03/19
投稿数: 77
お住まい・勤務地: 東京
投稿日時: 2004-08-03 03:59
引用:

gorisakuさんの書き込み (2004-08-02 23:38) より:
もしかしたらDll化したものは2重起動のチェックが出来ないのでしょうか?


そもそも DLL はプロセスになりません(原則として単体では実行できないから,というのが直感的な理由です).ですので Process クラスを利用するのはおそらく無意味でしょう.

一方の Mutex クラスですが,文字列(識別子)をとるコンストラクタがあるようです.VS.NET のヘルプをざっと読んだ限りでは,これを利用すれば目的が実現できるように思われます.

[ メッセージ編集済み 編集者: IZUMI Yusuke 編集日時 2004-08-03 04:03 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-03 07:57
 お二方に追加して、何をなぜ二重起動チェックするか、という仕様も明確にしないとダメ、かな。これはプロジェクトの中で、という話しですけど。

 その画面をDLLにしたのはなぜか。なぜ、その画面が2つ以上現れてはいけないのか。本当に2つ以上現れる要件はないのか。もっと前の処理で予防しなければならないのではないか。etc...
↑↑mutexやウインドウ上の文字列でチェックすると、複数のアプリケーションで使用した場合、チェックにかかって表示できなくなりますよ、という話し。なので、シングルトンパターンの適用、とか。

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-08-03 07:59 ]
gorisaku
ベテラン
会議室デビュー日: 2004/04/17
投稿数: 95
投稿日時: 2004-08-03 10:34
お三方 ご返答ありがとうございます。
詳しく仕様を書きますと、

DLL化したものは各マスタの検索画面で、
プログラムメニューから起動した場合は、単体起動モードとして起動し
その際に2重起動チェックを行いたい。
(問合せプログラムとして起動します)
メニュー以外のプログラムから起動した場合は、検索起動モードとして起動し
その際は2重起動のチェックは必要なし。
(項目の検索プログラムとして起動します)

メニュープログラムから起動した場合のみ2重起動チェックをと
思いいろいろやっておりますが...

このような場合にはどの様に制限をかけたらよろしいでしょうか?
いろいろ調べつつやっておりますがなかなか・・・(困

ご教授願えたらと思います。
よろしくお願いいたします。
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-08-03 10:42
諸農です。

引用:

DLL化したものは各マスタの検索画面で、
プログラムメニューから起動した場合は、単体起動モードとして起動し
その際に2重起動チェックを行いたい。



「起動」という言葉が誤解を生んでいるのかな。。(^_^;)

DLLというか、ある特定の型のフォームのクラスの
インスタンス化するタイミングのことなのかしら。

プログラムメニューから起動するというのは、
メニューフォームからあるフォームクラスを
インスタンス化しているのでしょうか?
それとも、EXEをキックしているのでしょうか?
そこがハッキリしないと回答も難しいと思います。


引用:

メニュー以外のプログラムから起動した場合は、検索起動モードとして起動し
その際は2重起動のチェックは必要なし。




単純に、クラスライブラリに検索用フォームの呼び出しメソッドと
問い合わせ用フォームの呼び出しメソッドの2つを準備しておくだ
けではダメなんでしょうか。
それぞれのメソッドの中で二重インスタンス化のチェックを行うとか。


_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-03 13:34
引用:

gorisakuさんの書き込み (2004-08-03 10:34) より:

DLL化したものは各マスタの検索画面で、
プログラムメニューから起動した場合は、単体起動モードとして起動し
その際に2重起動チェックを行いたい。
(問合せプログラムとして起動します)
メニュー以外のプログラムから起動した場合は、検索起動モードとして起動し
その際は2重起動のチェックは必要なし。
(項目の検索プログラムとして起動します)


とりあえず、
http://quick-tips.hp.infoseek.co.jp/vs.net/sample/index.html
ここから
サンプル1のソリューションをダウンロード
してみてください。で、コンパイルして、実行してください。

 「複数表示」と、「単数表示」というボタンがあり、どちらのボタンも同じフォームが起動します。「複数表示」は、ボタンをクリックするごとに、フォームが表示されます。「単数表示」は、1つのフォームしか表示されず、2度目以降はそのフォームが最前面に出ます。

 こういう動作でよろしいでしょうか?良かったら、動作を理解し、メンテができると思ったらまねてください。質問は受け付けますが、メンテができることが条件です。
gorisaku
ベテラン
会議室デビュー日: 2004/04/17
投稿数: 95
投稿日時: 2004-08-03 13:39
諸農殿 お返事ありがとうございます。

引用:

プログラムメニューから起動するというのは、
メニューフォームからあるフォームクラスを
インスタンス化しているのでしょうか?
それとも、EXEをキックしているのでしょうか?
そこがハッキリしないと回答も難しいと思います。



上記の回答ですが、フォームのインスタンスを作成しております。
DLLなのでEXEをキックする形ではありません。

引用:

単純に、クラスライブラリに検索用フォームの呼び出しメソッドと
問い合わせ用フォームの呼び出しメソッドの2つを準備しておくだ
けではダメなんでしょうか。
それぞれのメソッドの中で二重インスタンス化のチェックを行うとか。



今のところ使用している方法は、
1.引数(インスタンスへ渡す)を設定
 <0:検索起動 1:単体起動>
2.引数を判断し、2重起動を行う
 <dll側で2重起動を判断>
です。

どのような方法がBestかわからなかったので・・・
ちなみにForm_Load時にチェックをして
2重起動ならApplication.Exit()をしています。
それも良いのやら・・・

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