二重起動防止機能を使って他のデレクトリーからは起動できる様にするには?

解決


キャインキャイン  2005-03-17 01:09:21  No: 88870

VB.NETを用いて二重起動防止機能を使って他のデレクトリーからは起動できるが、同じデレクトリーからは起動できない方法があれば教えてください。

VB6.0なら、下記の方法で可能です。
Private Sub Form_Load()

'** 二重起動チェック
  if App.PrevInstance then
    msgbox "既に起動されています。"
    end
  end if

End Sub

一様、下記の方法は試してみましたが、他のデレクトリーから立ち上げても二重起動防止機能作動してしまいます。

Dim pr As Process()
    Dim prn As String
    '自アプリケーションのプロセス名を取得
    prn = Process.GetCurrentProcess.ProcessName
    '新しいProcessコンパーネントにリソースを関連づける
    pr = Process.GetProcessesByName(prn)
    'プロセス数が0以上なら
    If UBound(pr) <> 0 Then
        MsgBox("二重禁止", MsgBoxStyle.Exclamation)
        '終了
        End
    End If

よろしくお願いします


じゃんぬねっと  URL  2005-03-17 03:28:51  No: 88871

Mutex を使用して、識別名をそのディレクトリに設定するとか。
http://jeanne.wankuma.com/tips/process/02-mutex.html


キャインキャイン  2005-03-17 03:53:12  No: 88872

Dim hMutex As New System.Threading.Mutex(False, "C:\………")

        ' Mutex のシグナルを受信できるかどうか判断
        If hMutex.WaitOne(0, False) = True Then
            GC.KeepAlive(hMutex)         ' hMutex をガベージ コレクション対象から除外する
            Application.Run(New Form1)   ' アプリケーションを Form1 から起動
        End If

        ' Mutex を開放する
        hMutex.Close()

とやりましたが、
'System.ApplicationException' のハンドルされていない例外が mscorlib.dll で発生しました。

追加情報 : 指定されたパスが見つかりません。

とエラー表示されました。

ソース自体を、改良しないといけないのでしょうか?


じゃんぬねっと  URL  2005-03-17 04:34:20  No: 88873

こんにちは、じゃんぬねっと です。

> ソース自体を、改良しないといけないのでしょうか?

色々試して頂くと判りますが、「\」を別の文字に置き換えるなどする必要があります。
ファイル名として使えない文字は、「\」以外にもありますから
【/ : , ; * ? " < > |】のうちのどれかに置き換えればよいかと。

> Dim hMutex As New System.Threading.Mutex(False, "C:\………")

こんなベタ打ちではなく、

Dim hMutex As New System.Threading.Mutex(
    False, Application.ExecutablePath.Replace("\"c, "/"c)
)

としましょう。


キャインキャイン  2005-03-17 04:43:38  No: 88874

じゃんぬねっとさん

大変、失礼なことを聞きますが  ("\"c, "/"c) と言うのは、ドスコマンドの様にするという意味ですか?


C:\WINDOWS  なら
("\"c,"/"WINDOWS) の様にするのでしょうか?

初歩的な事を聞いて大変申し訳ございませんが、解答よろしくお願いします。


キャインキャイン  2005-03-17 04:55:42  No: 88875

重ね重ね申し訳ございません

C:\Program Files\Java
とかならどうなりますか?


じゃんぬねっと  URL  2005-03-17 06:06:19  No: 88876

> ドスコマンドの様にするという意味ですか?

String クラスの Replace メソッドってやつなんですけど...

それに、拙者・・・ もう、答え書いてますから・・・。
先のソースを、

Dim hMutex As New System.Threading.Mutex(
    False, Application.ExecutablePath.Replace("\"c, "/"c)
)

に置き換えればもう何も考えなくてもいいくらいなんです。


キャインキャイン  2005-03-17 21:58:05  No: 88877

じゃんぬねっとさん、ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加