17-10-12, 02:28 PM
كاتب الموضوع : DreamNet
هناك تقنية تسمى Mutual exclusionأحسن بكثير من PrevInstance
أنشئ كلاس جديدة وأضف هذا الكود داخل كلاس ولنسميها مثلا clsMutex
كود :
[COLOR=#000000][COLOR=#0000bb]Option Explicit
[/COLOR][color=#007700]Private Declare Function [/color][color=#0000bb]CreateMutex Lib [/color][color=#dd0000]"kernel32" [/color][color=#0000bb]Alias [/color][color=#dd0000]"CreateMutexA" [/color][color=#007700]([/color][color=#0000bb]lpMutexAttributes [/color][color=#007700]As [/color][color=#0000bb]SECURITY_ATTRIBUTES[/color][color=#007700], [/color][color=#0000bb]ByVal bInitialOwner [/color][color=#007700]As [/color][color=#0000bb]Long[/color][color=#007700], [/color][color=#0000bb]ByVal lpName [/color][color=#007700]As [/color][color=#0000bb]String[/color][color=#007700]) As [/color][COLOR=#0000bb]Long
[/COLOR][color=#007700]Private Declare Function [/color][color=#0000bb]CloseHandle Lib [/color][color=#dd0000]"kernel32" [/color][color=#007700]([/color][color=#0000bb]ByVal hObject [/color][color=#007700]As [/color][color=#0000bb]Long[/color][color=#007700]) As [/color][COLOR=#0000bb]Long
[/COLOR][color=#007700]Private Declare Function [/color][color=#0000bb]ReleaseMutex Lib [/color][color=#dd0000]"kernel32" [/color][color=#007700]([/color][color=#0000bb]ByVal hMutex [/color][color=#007700]As [/color][color=#0000bb]Long[/color][color=#007700]) As [/color][COLOR=#0000bb]Long
[/COLOR][color=#007700]Private [/color][COLOR=#0000bb]Type SECURITY_ATTRIBUTES
nLength [/COLOR][color=#007700]As [/color][COLOR=#0000bb]Long
lpSecurityDescriptor [/COLOR][color=#007700]As [/color][COLOR=#0000bb]Long
bInheritHandle [/COLOR][color=#007700]As [/color][COLOR=#0000bb]Long
End Type
[/COLOR][color=#007700]Private Const [/color][color=#0000bb]ERROR_ALREADY_EXISTS [/color][color=#007700]= [/color][color=#0000bb]183[/color][COLOR=#007700]&
Private [/COLOR][color=#0000bb]m_hMutex [/color][color=#007700]As [/color][COLOR=#0000bb]Long
[/COLOR][color=#007700]Public Function [/color][color=#0000bb]CheckMutex[/color][color=#007700]([/color][color=#0000bb]MutexName [/color][color=#007700]As [/color][color=#0000bb]String[/color][color=#007700]) As [/color][COLOR=#0000bb]Boolean
Dim S [/COLOR][color=#007700]As [/color][COLOR=#0000bb]SECURITY_ATTRIBUTES
m_hMutex [/COLOR][color=#007700]= [/color][color=#0000bb]CreateMutex[/color][color=#007700]([/color][color=#0000bb]S[/color][color=#007700], [/color][color=#0000bb]0[/color][color=#007700], [/color][color=#0000bb]MutexName[/color][COLOR=#007700])
If [/COLOR][color=#0000bb]Err[/color][color=#007700].[/color][color=#0000bb]LastDllError [/color][color=#007700]= [/color][COLOR=#0000bb]ERROR_ALREADY_EXISTS Then
CheckMutex [/COLOR][color=#007700]= [/color][COLOR=#0000bb]False
[/COLOR][COLOR=#007700]Else
[/COLOR][color=#0000bb]CheckMutex [/color][color=#007700]= [/color][COLOR=#0000bb]True
End [/COLOR][COLOR=#007700]If
[/COLOR][color=#0000bb]End [/color][COLOR=#007700]Function
Public [/COLOR][color=#0000bb]Sub CloseMutex[/color][COLOR=#007700]()
[/COLOR][COLOR=#0000bb]ReleaseMutex m_hMutex
CloseHandle m_hMutex
End Sub
[/COLOR][/COLOR]
في كود تحميل الفورم نكتب الكود التالي :
كود :
[color=#000000][COLOR=#007700]Private [/color][color=#0000bb]Sub Form_Load[/color][COLOR=#007700]()
[/COLOR][color=#0000bb]Set mut [/color][color=#007700]= New [/color][COLOR=#0000bb]clsMutex
[/COLOR][color=#007700]If [/color][color=#0000bb]Not mut[/color][color=#007700].[/color][color=#0000bb]CheckMutex[/color][color=#007700]([/color][color=#dd0000]"MyPrg"[/color][color=#007700]) [/color][COLOR=#0000bb]Then
MsgBox [/COLOR][COLOR=#dd0000]"Application is running"
[/COLOR][COLOR=#0000bb]Unload Me
End [/COLOR][COLOR=#007700]If
[/COLOR][COLOR=#0000bb]End Sub
[/COLOR][/COLOR]
جرب التشغيل حتى بتغيير اسم التطبيق لن تعمل إلا نسخة واحدة من البرنامج
بالتوفيق للجميع