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