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

A. *_*son 5 vb6 mutex single-instance

我有一个应用程序需要是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'
Run Code Online (Sandbox Code Playgroud)

现在,根据这篇文章,我相信我理解通过将NULL指针传递给CreateMutex函数,就像我上面一样,我基本上分配了与当前登录用户相关联的任何安全描述符.

如果这意味着我的想法(我可能需要更多指导)告诉我其他登录的用户将无法"看到"在原始用户会话下创建的互斥锁,也无法创建具有相同名称的互斥锁.

现在,经验证据似乎支持了这一点.我使用了一个消息框来弹出我收到的"LastDLLError",当另一个用户试图启动应用程序时(虽然它已经在另一个用户帐户下运行),我会收到一个ERROR_ACCESS_DENIED代码.我可以对此进行测试以及ERROR_ALREADY_EXISTS代码并且只是退出/或.然而,这感觉有点hackish,我想知道是否有人可以提出替代方案."正确"的做法似乎是将正确的指针传递给CreateMutex函数,这样任何用户都有权查看任何现有的互斥体(mutices?),但我不确定这是否可能没有当前登录用户是管理员(不易察觉).非常感谢任何协助/指导.提前致谢!

Joe*_*dan 2

去年年底我在 VB6 中寻找类似的解决方案。当时我找不到任何 VB6 应用程序跨用户边界通信的示例,因此我不得不编写自己的示例。

请参阅:通过信号量进行进程间通信

您可以使用该类创建并检查全局信号量,该信号量将告诉您您的应用程序是否已在任何用户下运行。我没有查看 Mutex API,但它们的用法非常相似。如果您已经编写了一些互斥体代码,则您需要转置 GetSecurityDescriptor 函数。