怎样让VB6程序只能运行一次
生活随笔
收集整理的這篇文章主要介紹了
怎样让VB6程序只能运行一次
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
方法一:利用PrevInstance屬性 If App.PrevInstance Then Call MsgBox("對(duì)不起本程序已在運(yùn)行中, 不得重復(fù)加載!!", vbCritical) End End If 優(yōu)點(diǎn):簡(jiǎn)單方便、 缺點(diǎn):針對(duì)性不強(qiáng)、隨意復(fù)制一份即可再次運(yùn)行、
方法二:創(chuàng)建互斥體(個(gè)人比較喜歡) Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (ByVal lpMutexAttributes As Long, ByVal bInitialOwner As Long, ByVal lpName As String) As Long Private Declare Function ReleaseMutex Lib "kernel32" (ByVal hMutex As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Dim ret As Long Private Sub Form_Load() ret = CreateMutex(ByVal 0, 1, "FORM1") '這里改成程序的標(biāo)題 If Err.LastDllError = 183 Then ReleaseMutex ret CloseHandle ret MsgBox "程序只能運(yùn)行一次!", vbCritical, "" End End If End Sub 優(yōu)點(diǎn):只要窗體的標(biāo)題不變,無(wú)論如何無(wú)法雙開(kāi) 缺點(diǎn):和優(yōu)點(diǎn)一樣、只要其他程序歷遍得到本窗體的句柄、然后sendmessage讓窗體的標(biāo)題(caption)改變就可以多開(kāi)
方法三:全局原子、(02.09補(bǔ)上代碼) Private Declare Function GlobalAddAtom% Lib "kernel32" Alias "GlobalAddAtomA" (ByVal AtomName As String) Private Declare Function GlobalFindAtom% Lib "kernel32" Alias "GlobalFindAtomA" (ByVal AtomName As String) Private Declare Function GlobalDeleteAtom% Lib "kernel32" (ByVal AtomName As Integer) Private Atom As Long Private Sub IsAtom() If GlobalFindAtom(App.EXEName) = 0 Then Atom = GlobalAddAtom(App.EXEName) Else unlaod Me End Sub Private Sub Form_Load() IsAtom End Sub Private Sub Form_Unload(Cancel As Integer) GlobalDeleteAtom Atom End Sub 優(yōu)點(diǎn)顯而易見(jiàn)、非常規(guī)手段絕對(duì)不可能達(dá)到多開(kāi)的目的、缺點(diǎn)么、、一旦程序被強(qiáng)制或非常規(guī)手段結(jié)束、就無(wú)法再次運(yùn)行、原因很簡(jiǎn)單、當(dāng)程序運(yùn)行時(shí)會(huì)創(chuàng)建全局原子、一般情況下在程序退出時(shí)(unload事件)會(huì)刪除全局原子、而強(qiáng)制結(jié)束程序則造成無(wú)法刪除全局原子、所以就造成了無(wú)法打開(kāi)的情況、、如果對(duì)這個(gè)情況你有好的解決方法、希望得到你的幫助、、
方法二:創(chuàng)建互斥體(個(gè)人比較喜歡) Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (ByVal lpMutexAttributes As Long, ByVal bInitialOwner As Long, ByVal lpName As String) As Long Private Declare Function ReleaseMutex Lib "kernel32" (ByVal hMutex As Long) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Dim ret As Long Private Sub Form_Load() ret = CreateMutex(ByVal 0, 1, "FORM1") '這里改成程序的標(biāo)題 If Err.LastDllError = 183 Then ReleaseMutex ret CloseHandle ret MsgBox "程序只能運(yùn)行一次!", vbCritical, "" End End If End Sub 優(yōu)點(diǎn):只要窗體的標(biāo)題不變,無(wú)論如何無(wú)法雙開(kāi) 缺點(diǎn):和優(yōu)點(diǎn)一樣、只要其他程序歷遍得到本窗體的句柄、然后sendmessage讓窗體的標(biāo)題(caption)改變就可以多開(kāi)
方法三:全局原子、(02.09補(bǔ)上代碼) Private Declare Function GlobalAddAtom% Lib "kernel32" Alias "GlobalAddAtomA" (ByVal AtomName As String) Private Declare Function GlobalFindAtom% Lib "kernel32" Alias "GlobalFindAtomA" (ByVal AtomName As String) Private Declare Function GlobalDeleteAtom% Lib "kernel32" (ByVal AtomName As Integer) Private Atom As Long Private Sub IsAtom() If GlobalFindAtom(App.EXEName) = 0 Then Atom = GlobalAddAtom(App.EXEName) Else unlaod Me End Sub Private Sub Form_Load() IsAtom End Sub Private Sub Form_Unload(Cancel As Integer) GlobalDeleteAtom Atom End Sub 優(yōu)點(diǎn)顯而易見(jiàn)、非常規(guī)手段絕對(duì)不可能達(dá)到多開(kāi)的目的、缺點(diǎn)么、、一旦程序被強(qiáng)制或非常規(guī)手段結(jié)束、就無(wú)法再次運(yùn)行、原因很簡(jiǎn)單、當(dāng)程序運(yùn)行時(shí)會(huì)創(chuàng)建全局原子、一般情況下在程序退出時(shí)(unload事件)會(huì)刪除全局原子、而強(qiáng)制結(jié)束程序則造成無(wú)法刪除全局原子、所以就造成了無(wú)法打開(kāi)的情況、、如果對(duì)這個(gè)情況你有好的解決方法、希望得到你的幫助、、
總結(jié)
以上是生活随笔為你收集整理的怎样让VB6程序只能运行一次的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: JAVA类(手机充电、放音乐示例)
- 下一篇: Ajax在请求数据时显示等待动画遮罩