我有一个应用程序需要是 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'
现在,根据this文章,我相信我理解通过将NULL指针传递给CreateMutex函数,就像我上面一样,我基本上分配了与当前登录用户相关联的任何安全描述符.
如果这意味着我的想法(我可能需要更多指导)告诉我其他登录的用户将无法“看到”在原始用户会话下创建的互斥锁,也无法创建具有相同名称的互斥锁.
现在,经验证据似乎支持了这一点.我使用了一个消息框来弹出我收到的“LastDLLError”,当另一个用户试图启动应用程序时(虽然它已经在另一个用户帐户下运行),我会收到一个ERROR_ACCESS_DENIED代码.我可以对此进行测试以及ERROR_ALREADY_EXISTS代码并且只是退出/或.然而,这感觉有点hackish,我想知道是否有人可以提出替代方案. “正确”的做法似乎是将正确的指针传递给CreateMutex函数,这样任何用户都有权查看任何现有的互斥体(mutices?),但我不确定这是否可能没有当前登录用户是管理员(不易察觉).非常感谢任何协助/指导.提前致谢!
我去年年底在VB6中寻找类似的解决方案.当时我无法找到任何跨用户边界进行通信的VB6应用程序的示例,因此我必须自己编写.见:Interprocess Communication via Semaphores
您可以使用该类创建和检查全局信号量,该信号量将告诉您应用程序是否已在任何用户下运行.我没有看Mutex API,但它们的用法非常相似.如果您已经编写了一些Mutex代码,那么GetSecurityDescriptor函数就是您想要转置的函数.