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
よろしくお願いします
Mutex を使用して、識別名をそのディレクトリに設定するとか。
http://jeanne.wankuma.com/tips/process/02-mutex.html
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 で発生しました。
追加情報 : 指定されたパスが見つかりません。
とエラー表示されました。
ソース自体を、改良しないといけないのでしょうか?
こんにちは、じゃんぬねっと です。
> ソース自体を、改良しないといけないのでしょうか?
色々試して頂くと判りますが、「\」を別の文字に置き換えるなどする必要があります。
ファイル名として使えない文字は、「\」以外にもありますから
【/ : , ; * ? " < > |】のうちのどれかに置き換えればよいかと。
> Dim hMutex As New System.Threading.Mutex(False, "C:\………")
こんなベタ打ちではなく、
Dim hMutex As New System.Threading.Mutex(
False, Application.ExecutablePath.Replace("\"c, "/"c)
)
としましょう。
じゃんぬねっとさん
大変、失礼なことを聞きますが ("\"c, "/"c) と言うのは、ドスコマンドの様にするという意味ですか?
例
C:\WINDOWS なら
("\"c,"/"WINDOWS) の様にするのでしょうか?
初歩的な事を聞いて大変申し訳ございませんが、解答よろしくお願いします。
重ね重ね申し訳ございません
C:\Program Files\Java
とかならどうなりますか?
> ドスコマンドの様にするという意味ですか?
String クラスの Replace メソッドってやつなんですけど...
それに、拙者・・・ もう、答え書いてますから・・・。
先のソースを、
Dim hMutex As New System.Threading.Mutex(
False, Application.ExecutablePath.Replace("\"c, "/"c)
)
に置き換えればもう何も考えなくてもいいくらいなんです。
じゃんぬねっとさん、ありがとうございました。
ツイート | ![]() |