تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
منع تشغيل أكثر من نسخة (Mutex)
#1
كاتب الموضوع : 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]

جرب التشغيل حتى بتغيير اسم التطبيق لن تعمل إلا نسخة واحدة من البرنامج

بالتوفيق للجميع
}}}
تم الشكر بواسطة:



التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم