利用VisualBasic开发应用程序时,常常会遇到这样的问题:生成的可执行文件在开发的机器上能够运行,复制到另一台机器上则无法运行,这种现象称之为应用程序与机器环境相关。造成这种现象主要有两个方面的原因:一是程序在运行过程中调用了一些文件,如数据库文件、文本文件和图片文件等,由于路径使用不当而无法定位;二是VisualBasic编译成的.EXE文件并不是实际意义上的EXE文件,VisualBasic系统中的标准控件和开发过程中用到的第三方控件,都没有包含在内。此现象可由图1形象地加以说明。
因此要解决用VB开发的应用程序与机器环境的相关性,必须从两个方面入手,一是保证应用程序能调用到所用文件,二是应用程序发布时同时发布所有用到的控件和DLL文件。
开发与路径无关的应用程序
无论应用程序论开发得多么好,是否成功还取决于其能否在任何机器的任何目录下都能运行,这就要求应用程序要自成一体,不但要包含所有用到的文件,而且还应与路径无关。实现应用程序与路径无关可用两种方法:一是利用VB.APP对象的PATH属性;二是把调用文件放在光盘上,直接调用。
1.利用VB.APP.PATH实现与路径无关
该方法的主要思路是在调用文件时利用相对路径,由于VB中不支持与DOS类似的相对路径,如调用当前目录下的“hh1.bmp”文件,写成“hh1.bmp”和“.\hh1.bmp“将会出错。为解决该问题,VB提供一个VB.APP对象,该对象有个名为PATH的属性,它记下了执行文件所在的路径,可在运行时访问。
用该方法创建与路径无关应用程序的要点如下:
(1)为应用程序(项目)创建一个目录,用以存放建立的窗体或其它文件。
(2)把应用程序所调用的文件放在该目录下或者放在该目录的子目录下。子目录最好按照引用文件的类型进行建立,如存放图片的子目录名为PIC,存放表的的目录为DBF等。
(3)除包含在可执行文件中的文件(如在设计时图片框加载的图片)外的其它文件,调用一律采用相对路径而禁用绝对路径。
这样在复制应用程序的时候,只要把应用程序目录下的所有文件(包括子目录)复制到任意目录下,应用程序都不会发生因找不到文件而产生的错误。
以下是一个程序实例,该实例显示一系列的角度逐渐变化的地球图片,从而形成地球转动动画。用VB设计一个窗体,窗体上放置一个图片框,名为Image1(Strech=.T.),给窗体加一个定时器控件,控件名为Timer1(Interval=25,enabled=.t.),该项目存放在A:\exam下,图片文件存放在A:\EXAM1\PIC下面。
使用绝对路径,程序代码如下:
Dimt1AsInteger
PrivateSubForm_Load()
t1=0注释:t1记录时钟事件发生的次数
EndSub
PrivateSubTimer1_Timer()
t1=t1 1
Ift1<100Then注释:图片共显示100幅
current=t1Mod8
注释:current表示当前应该显示哪张图片
FileName$=”A:\exam\pic\earth”&¤t&&”.jpg”注释:图片文件名(绝对路径)
Image1.Picture=LoadPicture(FileName$)注释:显示图片
Else
End注释:程序结束
EndIf
EndSub
该程序使用绝对路径调用外部文件(earth0.jpgfearth7.jpg),当把EXAM目录全部内容拷贝到其它机器上,抽出软盘后,运行程序将发生找不到文件错误。若采用VB.APP.PATH属性,把形成图片文件名的语句改写如下:
FileName$=VB.App.Path&&”\pic\earth”&¤t&&”.jpg”注释:形成显示图片的文件名
这样无论把exam目录完全复制到任何机器,程序均能运行。
2.从光盘调用文件实现与路径无关
把应用程序要调用文件放在光盘指定目录下,应用程序发行时和该光盘的拷贝一同发行。程序运行时,直接从光盘指定目录调用文件,故不会发生因找不到文件而出现的错误。由于不同机器上的光盘盘符不同,因此在开发时不能直接引用光盘的盘符,应用程序必须要先取得光盘盘符,然后再生成需要调用文件的完整文件名。
取得光驱盘符可以使用API函数,也可以通过以下程序段来检测到光驱盘符:
PrivateDeclareFunctionGetDriveTypeLib”kernel32″
Alias”GetDriveTypeA”(ByValnDriveAsString)AsLong注释:声明API函数
DimdriveAsString
DimaAsLong
Fori=0To25
drive=Chr(65 i)&&”:\”注释:形成盘符符号
a=GetDriveType(drive)
注释:得到盘符常数
Ifa=5Then
ExitFor
注释:如果是光驱则退出
EndIf
Next
以上程序段放在需要检测光驱的地方,通常放在Form.load事件中,光驱盘符存放在Drive变量中。检测到光驱后,则可直接调用光盘上的文件,如上例中,若PIC目录下的图片文件存放在光盘上,形成文件名的语句则可以用以下语句代替:
FileName$=Drive&&”exam\pic\earth”&¤t&&”.jpg”注释:形成显示图片的文件名
这样,我们就实现了从光盘调用文件与路径无关了。
包装应用程序实现与系统无关
解决了与文件路径相关的问题后,生成的可执行文件在其它没有安装VisualBasic的机器中,依然无法执行。原因之一是VisualBasic具有21个标准控件,这些控件都保存在动态链接库中(扩展名为DLL),VisualBasic的可执行程序中并没有包含;原因之二是开发的应用程序可能包含了第三方控件,VisualBasic的可执行程序中也不包含它们。因此在其它机器上执行VB开发的应用程序,必须使该机器包含程序中所有用到的动态链接库和控件文件(OCX或VBX文件),并需要把它们在Windows中加以注册。
为了减少拷贝和注册DLL、OCX和VBX给用户带来的麻烦,VB自带了一个包装程序,利用它给应用程序打包,生成安装盘。包中可以包含应用程序相关文件、DLL文件、OCX文件、VBX文件等。要把程序包安装到某台机器上时,只需在该机器上执行Setup程序即可,由Setup程序自动完成相应的DLL、OCX和VBX文件的拷贝和注册。
应用程序与机器环境无关性测试方法
要保证程序的机器环境的无关性,必须要进行严格测试。但由于在开发机器上,所有调用的文件都实际存在,DLL、OCX和VBX等文件存在并且已经注册,所以无法进行程序的机器环境无关性测试。测试只能在其它机器上进行,可以分成以下几步:
(1)另找一台只安装了Windows系统而没有安装任何其它软件的机器,且只有Windows系统子目录。
(2)在该机器上解包并执行程序。
(3)若执行无误则进入下一步,否则该软件需根据提示进行修改。该步骤保证了调用DLL、OCX和VBX的正确性,但并不能保证与路径无关。
(4)改变应用程序的安装目录再进一步验证路径无关性,若无误进入下一步,否则该软件需根据提示进行修改。该步骤保证软件自带文件的调用正确性。
(5)另找一台只安装了Windows系统的机器,Windows系统子目录与前台机器不一样,然后重复以上步骤,若无误说明该软件已经达到了机器环境无关性的要求。否则该软件需根据提示进行修改。该步骤保证软件绝对没有调用任何没有自带的外部文件。
应用程序的系统无关性是软件成败的一个重要因素,是程序设计中需要详细规划的一个重要方面,同时也是程序调试的一个重点内容。本文讨论的方法,稍加修改亦可适用于其它开发工具。->