我有一个应用程序需要是跨 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 函数,以便任何用户都具有查看任何现有互斥体(互斥体?)的适当权限,但我不太确定如果没有当前的登录用户是管理员(这是不可接受的)。非常感谢任何帮助/指导。