C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

二重起動を確実に禁止する


(過去ログ 1 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■436 / inTopicNo.1)  二重起動を確実に禁止する
  
□投稿者/ スフレ 二等兵(1回)-(2005/05/24(Tue) 00:03:36)

分類:[VB6以前] 


分類:[VB6以前] 

@ITの掲示板から http://jeanne.wankuma.com/tips/process/02-mutex.html 「二重起動を確実に禁止する」に辿り着いたのですが、このページのVB6の例、間違ってます。このコードだと、該当プロセスがない状態から2つのプロセスがほぼ同時に起動すると、

1. プロセス1でOpenMutex()が呼ばれる。返り値 0
2. プロセス2でOpenMutex()が呼ばれる。返り値 0
3. プロセス2でCreateMutex()が呼ばれる。成功。
4. プロセス1でCreateMutex()が呼ばれる。失敗。
5. プロセス1とプロセス2の両方でアプリケーション本体へ

ということが有り得ます。

正しい手順は、最初にCreateMutex()を呼びます。


0
引用返信 編集キー/
■438 / inTopicNo.2)  Re[1]: 二重起動を確実に禁止する
□投稿者/ じゃんぬ 少将(64回)-(2005/05/24(Tue) 10:47:35)
じゃんぬ さんの Web サイト

分類:[VB6以前] 

報告ありがとうございました。

Win32API の WaitForSingleObject 関数を使って、
Mutex の所有を要求した方が良さそうですね。

直しておきます。

0
引用返信 編集キー/
■446 / inTopicNo.3)  Re[2]: 二重起動を確実に禁止する
□投稿者/ スフレ 二等兵(2回)-(2005/05/24(Tue) 22:01:49)

分類:[VB6以前] 

変更されたようですが、CreateMutex() の返り値をチェックしてない今のコードではダメです。

・CreateMutex() して、成功ならアプリケーション本体へ。失敗なら二重起動なので終了
・アプリケーションが終るときには CloseHandle() で mutex を破棄

WaitForSingleObject() や ReleaseMutex() を使う必要はありません。


0
引用返信 編集キー/
■449 / inTopicNo.4)  Re[3]: 二重起動を確実に禁止する
□投稿者/ じゃんぬ 中将(67回)-(2005/05/25(Wed) 11:03:57)
じゃんぬ さんの Web サイト

分類:[VB6以前] 

No446に返信(スフレさんの記事)
> ・CreateMutex() して、成功ならアプリケーション本体へ。失敗なら二重起動なので終了
> ・アプリケーションが終るときには CloseHandle() で mutex を破棄

うーん、以下のようにすると、CreateMutex が必ず成功していまいます。
GetLastError も必ず 0 が返ります。(C ではうまくいくと記憶しています)
そこで、WaitForSingleObject() を使うことにしちゃったんですが...

Public Sub Main()
Dim hMutex As Long

' 新しい Mutex を生成する
hMutex = CreateMutex(ByVal 0&, 0&, "HOGEHOGE")

If GetLastError() = 0& Then
Dim hForm As Form1
Set hForm = New Form1

Call hForm.Show(vbModal)

Set hForm = Nothing
End If

Call CloseHandle(hMutex)
End Sub

もう少し、調べてみます。

# 管理人が何やってるんだか... orz


0
引用返信 編集キー/
■454 / inTopicNo.5)  Re[4]: 二重起動を確実に禁止する
□投稿者/ Starfish 二等兵(2回)-(2005/05/25(Wed) 23:36:39)

分類:[VB6以前] 

No449に返信(じゃんぬねっとさんの記事)
> うーん、以下のようにすると、CreateMutex が必ず成功していまいます。
> GetLastError も必ず 0 が返ります。(C ではうまくいくと記憶しています)

GetLastError のかわりに、Err.LastDllError でOKです。

0
引用返信 編集キー/
■456 / inTopicNo.6)  Re[5]: 二重起動を確実に禁止する
□投稿者/ じゃんぬ 中将(68回)-(2005/05/26(Thu) 09:20:58)
じゃんぬ さんの Web サイト

分類:[VB6以前] 

No454に返信(Starfishさんの記事)
> GetLastError のかわりに、Err.LastDllError でOKです。

なるほど、Err.LastDllError を使うのですね。
てっきり、GetLastError で拾うのとばかり思っていました。
勉強になりました、ありがとうございました。m(_ _)m

0
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -