Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在VBA中创建并使用命名互斥体_Vba_Excel_Ms Word - Fatal编程技术网

在VBA中创建并使用命名互斥体

在VBA中创建并使用命名互斥体,vba,excel,ms-word,Vba,Excel,Ms Word,我正在用Word和ExcelVBA做一些交叉的剪贴板魔术,我认为剪贴板作为一个共享资源应该由一个简单的互斥锁来保护 我如何在VBA中创建和发布命名互斥体?我找不到任何与VBA相关的东西。好像从来没有人从VBA创建互斥。这是不可能的吗?这个答案应该为您提供一种通用的方法来实现Excel VBA和word VBA之间的同步,使用互斥锁来保护一些共享数据。详细信息取决于您的目标应用程序 想法是这样的,您可以在Excel的模块ThisWorkbook中创建此代码,也可以在Word的模块ThisDocum

我正在用
Word
Excel
VBA做一些交叉的剪贴板魔术,我认为剪贴板作为一个共享资源应该由一个简单的互斥锁来保护


我如何在VBA中创建和发布命名互斥体?我找不到任何与VBA相关的东西。好像从来没有人从VBA创建互斥。这是不可能的吗?

这个答案应该为您提供一种通用的方法来实现Excel VBA和word VBA之间的同步,使用互斥锁来保护一些共享数据。详细信息取决于您的目标应用程序

想法是这样的,您可以在Excel的模块
ThisWorkbook
中创建此代码,也可以在Word的模块
ThisDocument
中创建此代码:

' Module ThisWorkbook or similarly ThisDocument

Private myMutex As Long

Private Const ERROR_ALREADY_EXISTS = 183&
Private Const MUTEX_ALL_ACCESS = &H1F0001

Private Declare PtrSafe Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (ByVal lpMutexAttributes As Long, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
Private Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare PtrSafe Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare PtrSafe Function OpenMutex Lib "kernel32" Alias "OpenMutexA" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal lpName As String) As Long
Private Declare PtrSafe Function ReleaseMutex Lib "kernel32" (ByVal hMutex As Long) As Long

Private Sub Workbook_Open()
    myMutex = CreateMutex(0, 1, "myMutex")
    Dim er As Long: er = Err.LastDllError
    If er = 0 Then
        MsgBox "myMutex Created"
    ElseIf er = ERROR_ALREADY_EXISTS Then
        MsgBox "mutex previously created"
        myMutex = OpenMutex(MUTEX_ALL_ACCESS, 0, "myMutex")
    Else
        MsgBox "mutex creation failed"
    End If
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    CloseHandle myMutex
End Sub

Private Sub doSomeCriticalTask()
    WaitForSingleObject myMutex, 20000 ' say we can wait for 20 seconds
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ' do critical section code, access shared data safely
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''
    ReleaseMutex myMutex
End Sub

我想您必须从Kernel32API导入相应的API函数
CreateMutex
OpenMutex
WaitForSingleObject
等等。这个老线程可能会有帮助:是的,我也这么想,但我如何在VBA中做到这一点?我可以在VB.NET中这样做,但是VBA的正确语法是什么?请看下面我的答案。它应该提供一些一般性的指导,你可以根据你想要达到的目标进行调整。希望这有帮助:)太好了,谢谢!虽然我自己经过多次的摆弄和反复试验才弄明白了其中的大部分。您仍然值得表扬。@wpfwanabe谢谢,很高兴能在这样有趣的问题上提供一些帮助:)