2015-10-27 3 views
2

Я делаю несколько переплетенных волшебников в буфере обмена с Word и Excel VBA, и я полагал, что буфер обмена, являющийся общим ресурсом, должен, вероятно, быть защищен простым мьютексом.Создайте и используйте названный mutex в VBA

Как я могу создать и отпустить именованный мьютекс в VBA? Я не мог найти ничего связанного с VBA. Как будто никто не создал мьютекс из VBA. Это невозможно?

+0

Я думаю, вы должны импортировать соответствующие API-функции из API Kernel32 ... 'CreateMutex',' OpenMutex', 'WaitForSingleObject' и т. д. –

+0

этот старый поток может быть полезен: http://stackoverflow.com/questions/947/how-to-use-a -mutex-in-visual-basic –

+0

Да, я так понял, но как мне это сделать в VBA? Я могу сделать это в VB.NET, но какой правильный синтаксис для VBA? – wpfwannabe

ответ

3

Этот ответ должен предоставить вам общий подход для достижения синхронизации между Excel-VBA и word-VBA с использованием мьютекса для защиты некоторых общих данных. Детали зависят от вашей целевой заявки ..

Идея идет как это, вы можете создать этот код в модуле ThisWorkbook из Excel и аналогично в 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 
+0

Отлично, спасибо! Хотя я сам это выяснил сам после многих попыток и проб и ошибок. Вы все еще заслуживаете кредита. – wpfwannabe

+0

@wpfwannabe спасибо, рад помочь в такой интересной проблеме :) –

Смежные вопросы