加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-17 07:20:25 所属栏目:百科 来源:网络整理
导读:我有一个应用程序需要是 Windows PC上所有用户会话的单实例应用程序.到目前为止,我的研究主要集中在使用互斥体来实现这一目标,但我遇到了一个问题,我不确定这是一个真正的问题,我认为这是一个最佳实践问题. 首先是代码: Private Const AppVer = "GlobalUNI
我有一个应用程序需要是 Windows PC上所有用户会话的单实例应用程序.到目前为止,我的研究主要集中在使用互斥体来实现这一目标,但我遇到了一个问题,我不确定这是一个真正的问题,我认为这是一个最佳实践问题.

首先是代码:

Private Const AppVer = "GlobalUNIQUENAME" ' 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函数就是您想要转置的函数.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读