用VB开发与机器环境无关的程序

2008-02-23 06:49:46来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

   利用Visual Basic开发应用程序时,常常会遇到这样的问题:生成的可执行文件在开发的机器上能够运行,复制到另一台机器上则无法运行,这种现象称之为应用程序与机器环境相关。造成这种现象主要有两个方面的原因:一是程序在运行过程中调用了一些文件,如数据库文件、文本文件和图片文件等,由于路径使用不当而无法定位;二是Visual Basic编译成的.EXE文件并不是实际意义上的EXE文件,Visual Basic系统中的标准控件和开发过程中用到的第三方控件,都没有包含在内。此现象可由图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下面。

   使用绝对路径,程序代码如下:

   Dim t1 As Integer

   Private Sub Form_Load()

   t1 = 0 注释:t1 记录时钟事件发生的次数

   End Sub

   Private Sub Timer1_Timer()

   t1 = t1 1

   If t1 < 100 Then 注释:图片共显示100幅

   current = t1 Mod 8

   注释:current表示当前应该显示哪张图片

   FileName$ = "A:\exam\pic\earth" && current && ".jpg" 注释:图片文件名(绝对路径)

   Image1.Picture = LoadPicture(FileName$) 注释:显示图片

   Else

   End 注释:程序结束

   End If

   End Sub

   该程序使用绝对路径调用外部文件(earth0.jpg fearth7.jpg),当把EXAM目录全部内容拷贝到其它机器上,抽出软盘后,运行程序将发生找不到文件错误。若采用VB.APP.PATH属性,把形成图片文件名的语句改写如下:

   FileName$ = VB.App.Path && "\pic\earth" && current && ".jpg" 注释:形成显示图片的文件名

   这样无论把exam目录完全复制到任何机器,程序均能运行。

   2.从光盘调用文件实现与路径无关

   把应用程序要调用文件放在光盘指定目录下,应用程序发行时和该光盘的拷贝一同发行。程序运行时,直接从光盘指定目录调用文件,故不会发生因找不到文件而出现的错误。由于不同机器上的光盘盘符不同,因此在开发时不能直接引用光盘的盘符,应用程序必须要先取得光盘盘符,然后再生成需要调用文件的完整文件名。

   取得光驱盘符可以使用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) && ":\" 注释:形成盘符符号

   a = GetDriveType(drive)

   注释:得到盘符常数

   If a = 5 Then

   Exit For

   注释:如果是光驱则退出

   End If

   Next

   以上程序段放在需要检测光驱的地方,通常放在Form.load事件中,光驱盘符存放在Drive变量中。检测到光驱后,则可直接调用光盘上的文件,如上例中,若PIC目录下的图片文件存放在光盘上,形成文件名的语句则可以用以下语句代替:

   FileName$ = Drive && "exam\pic\earth" && current && ".jpg" 注释:形成显示图片的文件名

   这样,我们就实现了从光盘调用文件与路径无关了。

   包装应用程序实现与系统无关
   解决了与文件路径相关的问题后,生成的可执行文件在其它没有安装Visual Basic的机器中,依然无法执行。原因之一是Visual Basic具有21个标准控件,这些控件都保存在动态链接库中(扩展名为DLL),Visual Basic的可执行程序中并没有包含;原因之二是开发的应用程序可能包含了第三方控件,Visual Basic的可执行程序中也不包含它们。因此在其它机器上执行VB开发的应用程序,必须使该机器包含程序中所有用到的动态链接库和控件文件(OCX或VBX文件),并需要把它们在Windows中加以注册。

   为了减少拷贝和注册DLL、OCX和VBX给用户带来的麻烦,VB自带了一个包装程序,利用它给应用程序打包,生成安装盘。包中可以包含应用程序相关文件、DLL文件、OCX文件、VBX文件等。要把程序包安装到某台机器上时,只需在该机器上执行Setup程序即可,由Setup程序自动完成相应的DLL、OCX和VBX文件的拷贝和注册。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:树视TreeView树视的使用技巧

下一篇:VB6.0初学者的10个编程小技巧