怎样让VB6程序只能运行一次

原创 2013年12月05日 17:02:54
方法一:利用PrevInstance属性
If App.PrevInstance Then
Call MsgBox("对不起本程序已在运行中, 不得重复加载!!", vbCritical)
End
End If
优点:简单方便、
缺点:针对性不强、随意复制一份即可再次运行、



方法二:创建互斥体(个人比较喜欢)
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") '这里改成程序的标题
If Err.LastDllError = 183 Then
   ReleaseMutex ret
   CloseHandle ret
   MsgBox "程序只能运行一次!", vbCritical, ""
   End
End If
End Sub
优点:只要窗体的标题不变,无论如何无法双开
缺点:和优点一样、只要其他程序历遍得到本窗体的句柄、然后sendmessage让窗体的标题(caption)改变就可以多开



方法三:全局原子、(02.09补上代码)
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
优点显而易见、非常规手段绝对不可能达到多开的目的、缺点么、、一旦程序被强制或非常规手段结束、就无法再次运行、原因很简单、当程序运行时会创建全局原子、一般情况下在程序退出时(unload事件)会删除全局原子、而强制结束程序则造成无法删除全局原子、所以就造成了无法打开的情况、、如果对这个情况你有好的解决方法、希望得到你的帮助、、
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

VB6 防止程序二次运行

  • 2016年03月12日 14:26
  • 1.19MB
  • 下载

植大型VB6应用程序到.NET

大型项目从VB6迁移到.NET并不是一件很容易的事情。我们公司的客户也有使用我们早期版本的ActiveX控件,如果想迁移到.NET控件,可能需要很多工作要做。幸好,最近有一个IT服务提供商花了9个月时...

win7(64位)下的某些文件,用VB6开发的程序无法判断是否存在

我用VB6开发的程序,想在WIN7(64位)上运行,其中有个功能是查找WIN7(64位)系统目录下的某个文件是否存在。 结果发现,那个文件确实存在,但程序就是提示找不到文件,同样的程序在XP下运行没...

让程序轻松支持换肤功能--VB6示例

特别注明:如有转载请包含此出处http://blog.csdn.net/aohan   说到换肤,我们脑子当中可能就会浮现很多商业软件那些漂亮的皮肤,自从XP流行以来,程序的外观变得比以往...
  • huanzx
  • huanzx
  • 2017年07月02日 16:48
  • 1403

VB6: 通过窗口句柄得到窗口所在程序的名称和路径(实例)

Option Explicit Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassN...

VB6.EXE - 应用程序错误解决办法

使用VB6.0的时候,无论是打开空的工程或其它工程,当关闭软件的时候,偶尔会看到类似下图的提示框:尤其是企业版的VB6.0,最容易出现这样的问题,而一般的精简版,不常出现这样的问题!  ...
  • heary29
  • heary29
  • 2015年01月16日 08:56
  • 519

让 VB6 开发的程序拥有视觉样式( XP 风格),VC++6.0 同样适用

让 VB6 开发的程序拥有视觉样式( XP 风格),VC++6.0 同样适用。     相信用 VB6 或 VC6 开发过程序的朋友都曾郁闷过吧,VB6 或 VC6 做的程序都没有视觉样式(XP...
  • ROVAST
  • ROVAST
  • 2014年05月19日 16:58
  • 2154

VB6如何让程序只能启动一个实例

  • 2007年11月17日 18:04
  • 24KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:怎样让VB6程序只能运行一次
举报原因:
原因补充:

(最多只允许输入30个字)