VB6:跨所有用户会话的单实例应用程序

我有一个应用程序需要是 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函数就是您想要转置的函数.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐