VB6:跨所有用户会话的单实例应用程序 [英] VB6: Single-instance application across all user sessions

查看:16
本文介绍了VB6:跨所有用户会话的单实例应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个应用程序需要是跨 Windows PC 上所有用户会话的单实例应用程序.到目前为止,我的研究主要集中在使用互斥锁来完成此任务,但我遇到了一个我不确定是否真的是问题的问题,我认为这确实是一个最佳实践问题.

I have an application that needs to be a single-instance app across all user sessions on a Windows PC. My research thus far has centered around using a mutex to accomplish this, but I am having an issue that I am not sure is really an issue, this is really a best-practice question I believe.

首先是代码:

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'

现在,基于这个 文章我相信我明白,通过将 NULL 指针传递给上面的 CreateMutex 函数,我基本上分配了与当前登录用户关联的任何安全描述符.

Now, based on this article I believe I understand that by passing the NULL pointer to the CreateMutex function as I am above I'm basically assigning whatever security descriptor is associated with the currently logged in user.

如果这意味着我认为它确实(我可能需要更多指导)告诉我其他登录用户将无法看到"在原始用户会话下创建的互斥锁,他们也将无法创建一个同名的互斥锁.

If that means what I think it does (I may need more guidance here) that tells me that other users who log in will not be able to "see" the mutex created under the original user's session, nor will they be able to create a mutex with the same name.

现在,经验证据似乎支持这一点.我使用消息框弹出我收到的LastDLLError",当另一个用户尝试启动应用程序时(当它已经在另一个用户帐户下运行时)我会收到一个 ERROR_ACCESS_DENIED 代码.我可以与 ERROR_ALREADY_EXISTS 代码一起对此进行测试,并且只是退出或退出.但是,这感觉有点骇人听闻,我想知道是否有人可以提出替代方案.要做的正确"事情似乎是将正确的指针传递给 CreateMutex 函数,以便任何用户都具有查看任何现有互斥体(互斥体?)的适当权限,但我不太确定如果没有当前的登录用户是管理员(这是不可接受的).非常感谢任何帮助/指导.提前致谢!

Now, emperical evidence seems to back this up. I used a message box to pop the "LastDLLError" I was receiving, and when another user attempted to launch the application (while it was already running under another user account) I would receive an ERROR_ACCESS_DENIED code. I am OK with testing against this along with the ERROR_ALREADY_EXISTS code and just exiting on either/or. However, this feels sort of hackish and I'm wondering if someone can suggest an alternative. The "right" thing to do seems to be to pass the proper pointer to the CreateMutex function such that any user has the proper permissions to view any existing mutexes (mutices?), but I'm not so sure this is possible without the currently logged in user being an admin (which is unacceptible). Any assistance/guidance is greatly appreciated. Thanks in advance!

推荐答案

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

I was looking for a similar solution in VB6 late last year. At the time I was unable to find any examples of VB6 apps communicating across the user boundary, so I had to write my own.

参见:通过信号量进行进程间通信

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

You can use the class to create and check for a global semaphore which will tell you if your app is already running under any user. I didn't look at the Mutex APIs but their usage is very similar. The GetSecurityDescriptor function is what you'll want to transpose if you've already got some Mutex code written.

这篇关于VB6:跨所有用户会话的单实例应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆