您的位置:首页 > 其它

防止程序运行的4中经典方法

2009-02-20 08:58 381 查看
分别有一下几种方法
1.查找窗口法
用Findwindow函数查找窗口类名和标题的窗口,然后在去判断是否执行程序。如果找到了说明程
序已经运行,不运行程序。如果没有找到,则启动当前程序。

Findwindow的API函数声明如下:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long

具体实现:调用Findwindow函数,得到一个返回值,把此值赋给句柄变量,
用IF语句判断句柄变量等于0时启动程序,否则结束程序,提示程序已运行

演示代码如下:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long 'Findwindow的API声明

Private Sub Form_Initialize()
Dim Frmhwnd As Long '定义一个变量接收Findwindow返回的句柄
Frmhwnd = FindWindow(vbNullString, "运行的窗口") '调用Findwindow查找"运行的窗口"标题的窗口
If hwnd = 0 Then '没有找到返回0
FrmMain.Show '创建并显示窗口
Else
MsgBox "程序已经运行,不能再次装载", vbExclamation, "提示" '返回句柄不为0,找到窗口提示程序运行
End '软件不运行,退出程序
End If
End Sub

2.使用互斥对象
互斥对象:能够确保多个线程对单个资源的互斥访问,即一起运行的任何线程对某资源的访问都是排他的。
该资源不会同时被两个或两个以上的线程所访问。利用互斥对象就可以限制进程的启动。

Createmutex的API函数声明如下
Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (ByVal lpMutexAttributes As Long, _
ByVal bInitialOwner As Long, ByVal lpName As String) As Long

具体实现:通过调用API函数Createmutex创建一个互斥对象,如果成功并同时调用GetlasError函数返回的值
ERROR_ALREADY_EXISTS比较,若相等,那么说明当前进程不是应用程序的第一个实例,直接结束掉程序并提示
程序已运行。若不相等,则说明是应用程的第一个实例。

演示代码如下:

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 '关闭一个互斥体对象
Public ret As Long

Private Sub Form_Load()
ret = CreateMutex(ByVal 0, 1, "互斥对象") '调用CreateMutex创建一个名为“互斥对象”的互斥对象
If Err.LastDllError = 183 Then '判断程序是不是第一个实例
MsgBox "程序只能运行一次!", vbExclamation, "提示" '不是第一个实例提示
End '软件不执行,程序退出
End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
Call ReleaseMutex(ret) '释放互斥对象
Call CloseHandle(ret) '关闭互斥对象
End Sub

注意:在软件关闭之时应该要释放和关闭互斥对象,否则在下次运行程序将无法打开程序,原因是互斥对象还存在。

3.全局原子法
全局原子:由Windows系统负责维持的,它能保证其中的每个原子都是唯一的,管理其引用计数,
并且当该全局原子的引用计数为0时,系统就会从该内存将该原子清除掉。

添加全局原子用API函数GlobalAddatom
Public Declare Function GlobalAddAtom Lib "kernel32" Alias "GlobalAddAtomA" (ByVal lpString As String) As Integer
查找全局原子用API函数GlobalFindAtomA
Public Declare Function GlobalFindAtom Lib "kernel32" Alias "GlobalFindAtomA" (ByVal lpString As String) As Integer
删除全局原子用API函数GlobalDeleteAtom
Public Declare Function GlobalDeleteAtom Lib "kernel32" Alias "GlobalDeleteAtom" (ByVal nAtom As Integer) As Integer

具体实现:利用GlobalAddatom函数向系统添加全局原子,然后利用GlobalFindAtomA函数查找是否存在该原子,
若村子结束运行并提示程序已运行,否则启动程序。在进程退出时记得使用GlobalDeleteAtom函数删除之前添加
的全局原子,否则下次程序将无法启动。

利用全局原子的引用计数规则,还可以判断当前共运行了该程序的多少个实例。

4.利用App对象的PrevInstance属性

这个比较简单一点,利用VB自带的利用App对象的PrevInstance属性的真假就可以判断程序有没有运行了
当App.PrevInstance为True说明程序已经运行了,此时在运行程序将提示程序已经运行了,不可以在运再
次装在,否则App.PrevInstance为False则可以运行程序。

演示代码如下:

Private Sub Form_Load()
If App.PrevInstance = True Then
MsgBox "程序已经运行,不能再次装载", vbExclamation, "提示"
Unload Me
End If
End Sub
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: