我有一个应用程序需要在Windows PC上的所有用户会话中成为单实例应用程序。到目前为止,我的研究主要集中在使用互斥体来完成这个任务,但是我有一个问题,我不确定是否真的是一个问题,这是我相信的一个最佳实践问题。VB6:跨所有用户会话的单实例应用程序
这里第一是所有的代码的:
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'
现在,基于this文章中,我相信我的理解是由NULL指针传递给CreateMutex功能,因为我上面我基本上指派任何安全描述符与当前登录的用户相关联。
如果这意味着我认为它的确如此(我可能需要更多的指导),这告诉我其他登录用户将无法“看到”在原用户会话下创建的互斥体,也不会能够创建一个具有相同名称的互斥体。
现在,经验证据似乎支持了这一点。我使用了一个消息框来弹出我正在接收的“LastDLLError”,并且当另一个用户试图启动应用程序时(它已经在另一个用户帐户下运行),我将收到一个ERROR_ACCESS_DENIED代码。我可以与ERROR_ALREADY_EXISTS代码一起对此进行测试,然后在/或上退出。然而,这感觉有点骇人听闻,我想知道如果有人可以提出一个替代方案。要做的“正确”事情似乎是将适当的指针传递给CreateMutex函数,以便任何用户都有适当的权限来查看任何现有的互斥体(mutices?),但是我不确定如果没有当前的互斥体登录的用户是管理员(这是不可感知的)。任何援助/指导非常感谢。提前致谢!
感谢大家的反馈。我将修改我的代码,使其像Joe的代码中的代码一样,随附的测试应用程序证实我应该能够使其工作。结束这一个。 – 2011-01-26 22:19:33