首页 目录页 热情软件屋 问专家

李海文选

再谈“防止应用程序两次加载”

李海

本文发表在97年7月28日《计算机世界》28期

  《计算机世界》报1997年5月26日的第255版和6月30日第189版先后发表了顾岱鸿和张新宇的文章讨论了“防止应用程序两次加载”的问题,由于这是一个非常实际的问题,有必要再作一些说明。两篇文章采用的方法都是利用Windows API的函数GetModuleHandle和GetModuleUsage,实际上有更为简单的做法。VB有一个App对象,它有一个PrevInstance属性,如果应用程序已经被加载了一次,该属性返回True,否则返回False。熟悉C语言Windows编程的读者可能会意识到这实际上是C语言中WinMain函数的hPrevInstance参数。利用这一参数我们可以将启动程序进行如下简化:

Sub Main()
	On Error GoTo errMain

	If App.PrevInstance Then
		MsgBox "Demo程序已经加载!", 64
	…………
End Sub

  同前两篇文章中介绍的方法相比,这种方法避免了调用Windows API时繁琐的声明语句,可以用于VB 3.0以上的各个版本,对于16位和32位版本均适用,而且可以减少因为调用Windows API不慎而引发GPF错误的可能。
  App对象是VB的内建对象,用户可以在程序的任何地方使用而无须事先声明。但可能是由于App对象多用于比较高级的设计问题,一般的书籍都未提及,因而很多人对此感到陌生,在此想作一简单的介绍。App对象有很多有用的属性:

属性 用途
EXEName 应用程序(.EXE)的文件名,不包括扩展名和路径。主要用于某些Windows API的调用。该属性只能读,不能写。
HelpFile 程序帮助文件(.HLP)的文件名,包括扩展名和路径。利用该属性和控制的HelpContextID属性可以实现上下文敏感的在线帮助。该属性可以读写。
Path 应用程序所在目录的绝对路径(包括驱动器)。该属性用途最为广泛。该属性只能读,不能写。
Title 出现在Windows 3.x的任务管理器和Windows 95的任务条上的程序名,最长40个字符。该属性可以读写。

  读者可以利用以上属性编写自己的应用程序。

回到《李海文选》目录

如果您有任何建议,请给我发电子邮件:
版权所有 李海,热情软件屋 1997-2006


WU Banner from WebUnion Chinese Network