我的程序建立MUTEX,但是程序关闭后并不能释放MUTEX,RELEASEMUTEX总是返回288号错误.这是为什么呀~~~?急等.'------模块代码
Public Mutex As Long
Public Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As SECURITY_ATTRIBUTES, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
Public Declare Function OpenMutex Lib "kernel32" Alias "OpenMutexA" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal lpName As String) As Long
Public Declare Function ReleaseMutex Lib "kernel32" (ByVal hMutex As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As LongPublic Type SECURITY_ATTRIBUTES
       nLength   As Long
       lpSecurityDescriptor   As Long
       bInheritHandle   As Long
End Type
'------窗体代码
Private Sub Command1_Click()
Dim sa As SECURITY_ATTRIBUTES
Mutex = CreateMutex(sa, False, "TREXRIII")
If Err.LastDllError = 183 Then
Label1.Caption = "已存在 " & Mutex
Else
Label1.Caption = "已建立 " & Mutex
End If
End SubPrivate Sub Command2_Click()
ReleaseMutex Mutex
If Err.LastDllError <> 0 Then
Label1.Caption = "释放失败 " & Err.LastDllError
End If
End Sub

解决方案 »

  1.   

    http://www.programfan.com/doc/vbapi/CreateMutex.htm
      

  2.   

    ReleaseMutex是释放Mutex的所有权。
    CreateMutex第二个参数指定当前线程是否拥有Mutex的所有权,若此命名Mutex是你创建的,bInitialOwner又为非零,则当前线程拥有Mutex的所有权,否则都不会拥有Mutex的所有权!所以你对bInitialOwner为0时CreateMutex创建的Mutex,调用ReleaseMutex是错误的,错误288代表你无权这样做!这里,简单CloseHandle关闭即可,在bInitialOwner为非零时调用CreateMutex,你才需调用ReleaseMutex,当然,其后仍需调用CloseHandle。若你的程序不调用CloseHandle,该Mutex会一直存在,直到程序退出,IDE环境下可能要退出VB才行。