Windows PC 上のすべてのユーザー セッションで単一インスタンス アプリにする必要があるアプリケーションがあります。これまでの私の研究は、これを達成するためにミューテックスを使用することに集中していましたが、実際に問題があるかどうかわからない問題が発生しています。これは本当にベストプラクティスの質問だと思います.
まず、コードは次のとおりです。
Private Const AppVer = "Global\UNIQUENAME" ' This is not what i am using but the name is unique
Public Sub Main()
Dim mutexValue As Long
mutexValue = CreateMutex(ByVal 0&, 1, AppVer)
If (Err.LastDllError = ERROR_ALREADY_EXISTS) Then
SaveTitle$ = App.Title
App.Title = "... duplicate instance."
MsgBox "A duplicate instance of this program exists."
CloseHandle mutexValue
Exit Sub
End If
' Else keep on truckin'
さて、この記事に基づいて、上記のように NULL ポインターを CreateMutex 関数に渡すことで、現在ログインしているユーザーに関連付けられているセキュリティ記述子を基本的に割り当てていることを理解していると思います。
それが私が思うことを意味する場合 (ここでさらにガイダンスが必要な場合があります)、ログインする他のユーザーは、元のユーザーのセッションで作成されたミューテックスを「見る」ことができず、作成することもできません。同じ名前のミューテックス。
現在、経験的証拠がこれを裏付けているようです。メッセージ ボックスを使用して受け取った "LastDLLError" をポップしました。別のユーザーが (別のユーザー アカウントで既に実行されているときに) アプリケーションを起動しようとすると、ERROR_ACCESS_DENIED コードを受け取りました。ERROR_ALREADY_EXISTS コードと一緒にこれに対してテストし、どちらかまたは両方で終了しても問題ありません。しかし、これは一種のハックのように感じられ、誰かが代替案を提案できるかどうか疑問に思っています. 「正しい」ことは、適切なポインターを CreateMutex 関数に渡して、すべてのユーザーが既存のミューテックス (mutices?) を表示するための適切なアクセス許可を持つようにすることですが、現在ログインしているユーザーが管理者であること (これは受け入れられません)。どんな支援/指導も大歓迎です。