微信公众号 
图码生活

每天发布有五花八门的文章,各种有趣的知识等,期待您的订阅与参与
电脑报 1992-2001 十年文章全集
电脑报 1992-2001 十年文章全集
包含从 1992 年 - 2001 年间,两万余篇期刊文章,查询最少输入两个字符
随便看看
读取中
读取中
标题防止并处理程序的多重启动
栏目软件世界
作者谢肇波
发布2001年35期
  什么叫防止与处理多重启动?假设asp文件与EditPlus关联,你双击一个asp文件,Windows系统自动使用EditPlus打开asp文件,然后再双击一个asp文件,这个时候,你发现并没有再启动一个EditPlus,而是已经启动的那个EditPlus截获了第二个副本启动的参数(它打开了你第二次双击的文件),具体说,是接收了其副本发送过来的信息(Message),这就使程序能防止自身多重启动,这样有利于节省资源。这是一项很令人兴奋的功能,在VB中如何实现呢?
  大多数朋友可能想到了API,当然,使用API肯定可以做到!不过,我这次实现这个功能,完全没有使用API,只是使用了VB中的两个普通函数SaveSetting与GetSetting。并且非常简单,比API更高效!不信?看下去!
  因为要在程序尽可能少占内存时作出判断,所以,建议把启动事件设为Main(),因为,此时还未加载任何窗体与控件。
  首先,启动一个工程,添加一个模块,一个计时器timer1,interval设为100。然后,选择菜单“工程→工程属性→启动对象”,单击下拉框选择“Sub Main”,你会看到,在模块中已经添加了这个过程,在模块中输入以下代码:
  '自定义函数,用以处理参数
  Public Function getprom(prom)
  If prom = "" Then Exit Function
  getprom = prom
  If Asc(prom) = 34 Then
  '判断是否为双引号,如果是则去掉参数两边的双引号
  getprom =Mid(prom,2,Len(prom)- 2)
  End If
  End Function
  Sub Main()
  Dim commandstring As String
  commandstring = VBA.Command
  '获取参数
  If App.PrevInstance = True Then
  '判断自身是否已经在运行
  commandstring = Form1.getprom(commandstring)
  SaveSetting App.EXEName,"参数信息","command",commandstring '保存尾部参数(文件路径)到注册表中
  End '然后退出
  Else
  commandstring = Form1.getprom(commandstring)
  Form1.Picture = LoadPicture(commandstring)
  Form1.Visible = True
  End If
  End Sub
  为了判断注册表中的参数(文件路径)是否正确,可使用文件系统对象(FileSystemObjcet)的FileExists来判断文件是否存在,首先,必须先引用它!单击“工程→引用”,在列表框中找到“Microsoft scripting runtime”并复选它,单击确定,然后,在窗体Form1声明部分添加代码:
  '引用新控件实例
  Dim Fso AS New FileSystemObject
  现在,到了关键部分,我们要不停地判断注册表中是否有信息,双击timer1,输入如下代码:
  Sub Timer1_timer()
  Dim com As String
  com = GetSetting(App.EXEName,"参数信息","command",Default)
  '获取注册表中的值
  If Fso.FileExists(com) = True Then
  '如果键值所指文件存在
  Me.Picture = LoadPicture(com)
  '添加处理代码,假如是一幅图片
  SaveSetting App.EXEName,"参数信息", "command",""
  '获取后立刻给键值赋空以防止死循环
  End If
  End Sub
  大功告成,试一试,特爽!还是那句话,只要稍加修改,它便能处理声音、文本。
  以上代码在Windows 98、Visual Basic 6.0下调试通过。