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?),但我不确定这是否可能没有当前登录用户是管理员(不易察觉).非常感谢任何协助/指导.提前致谢!
去年年底我在 VB6 中寻找类似的解决方案。当时我找不到任何 VB6 应用程序跨用户边界通信的示例,因此我不得不编写自己的示例。
请参阅:通过信号量进行进程间通信
您可以使用该类创建并检查全局信号量,该信号量将告诉您您的应用程序是否已在任何用户下运行。我没有查看 Mutex API,但它们的用法非常相似。如果您已经编写了一些互斥体代码,则您需要转置 GetSecurityDescriptor 函数。
| 归档时间: |
|
| 查看次数: |
3117 次 |
| 最近记录: |