VB软件设计中的几个问题之一(转)

在软件开发过程中,有一些看似很简单的问题,却很容易被一般的开发人员所忽略,这些“Bugs”的存在,影响我们软件走向商品化。下面所列出的是笔者在使用Visual Basic开发软件时,碰到了几个这类问题,这里给出其解决方法,供大家探讨交流。

   一、防止应用程序加载两份

   当我们的应用程序在 Windows下运行后,在操作过程中,有时会把它最小化隐藏起来,或者切换到程序管理器下进行其它操作,而后又想进入原来的应用程序,这时如果忘记了刚才启动的应用程序,又去重新启动该应用程序,在内存中就同时加载了两份同样的应用程序,这样不但占用了内存空间,而且容易引起误操作,造成数据的损失。为了避免这种情况发生,就需要程序能够给出提示“已经加载过”或直接进入第一次被加载的应用程序中。对于这个问题,看起来比较难办,其实我们只要对 Windows管理应用程序的机理有所了解,就很容易解决。我们知道,对于每一个运行着的应用程序, Windows都分配给一个唯一的“句柄(Handle)”和一个模块代码(Module)。当同时运行两份相同的程序时,两份程序的模块代码都相同,因此,只要找到内存中两个相同的模块代码,我们就知道有两份程序在运行,从而可以控制它。 Windows提供的两个接口函数GetModuleHandle和GetModuleUsage可以完成此任务。具体方法如下,首先在一个新的模块文件(?*.Bas)中声明API函数。

   Declare Function GetModuleHandle Lib"Kernel" (ByVal lpProg Name$)

   Declare Function GetModuleUsage Lib"Kernel"(ByVal hModule)

   同时建立一个子过程,名字为main,子过程中的代码如下:

   Sub Main() On Error GoTo errMain‘错误处理Dim hModule%‘模块句柄Dim AppCount%‘应用程序的个数appPath$=app.Path +""‘应用程序的启动路径hModule %=GetModuleHandle(appPath$+app.EXEName+".exe")‘获得该程序的句柄。

   AppCount %=GetModuleUsage(hModule)‘获得模块代码,即运行的应用程序数目。

   lf AppCount%>1 Then‘同一应用程序数大于1 MsgBox"程序已经加载",64 End‘结束当前启动的应用程序Elsc mainForm.Show‘mainForm是程序的主窗体End lf Exit Sub errMain: lf Err<>0Then MsgBox"启动程序时发生错误",64 Exit Sub End lf End Sub该过程完成后,在VB3.0主菜单[options]下,选择[Project]菜单项,设定[Start up From]项为Sub main,即程序运行时,最先从Sub main子程序开始。这样保证上面的代码一定被执行。Sub main是VB3.0约定的子过程名,不能用其它的名字来代替。

   重新生成EXE文件,在程序管理器下,启动该应用程序,然后把产生的窗体最小化,接着从程序管理器下再运行它,用户将看到一个消息框,告诉用户,应用程序已被加载过了,第二份程序终止执行。上面的程序仅用来防止加载二份程序,但还没有做到当不能启动第二份时,自动进入到第一份程序。要做到这一点,所涉及的程序较复杂,这里就不详细介绍了。[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8781179/viewspace-925194/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/8781179/viewspace-925194/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值