用VB開(kāi)發(fā)與機(jī)器環(huán)境無(wú)關(guān)的程序
發(fā)表時(shí)間:2024-02-23 來(lái)源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]作者: 童愛(ài)紅、譚明金 軟件的開(kāi)發(fā),必須要保證與機(jī)器環(huán)境的無(wú)關(guān)性,這是一個(gè)在開(kāi)發(fā)和調(diào)試過(guò)程中都必須注意的問(wèn)題。本文以Visual Basic程序設(shè)計(jì)語(yǔ)言為例,詳細(xì)探討了與機(jī)器環(huán)境無(wú)關(guān)的應(yīng)用程序開(kāi)發(fā)與測(cè)試的方法。 利用Visual Basic開(kāi)發(fā)應(yīng)用程序時(shí),常常會(huì)遇到這樣的問(wèn)題:生成的可執(zhí)...
作者: 童愛(ài)紅、譚明金
軟件的開(kāi)發(fā),必須要保證與機(jī)器環(huán)境的無(wú)關(guān)性,這是一個(gè)在開(kāi)發(fā)和調(diào)試過(guò)程中都必須注意的問(wèn)題。本文以Visual Basic程序設(shè)計(jì)語(yǔ)言為例,詳細(xì)探討了與機(jī)器環(huán)境無(wú)關(guān)的應(yīng)用程序開(kāi)發(fā)與測(cè)試的方法。
利用Visual Basic開(kāi)發(fā)應(yīng)用程序時(shí),常常會(huì)遇到這樣的問(wèn)題:生成的可執(zhí)行文件在開(kāi)發(fā)的機(jī)器上能夠運(yùn)行,復(fù)制到另一臺(tái)機(jī)器上則無(wú)法運(yùn)行,這種現(xiàn)象稱(chēng)之為應(yīng)用程序與機(jī)器環(huán)境相關(guān)。造成這種現(xiàn)象主要有兩個(gè)方面的原因:一是程序在運(yùn)行過(guò)程中調(diào)用了一些文件,如數(shù)據(jù)庫(kù)文件、文本文件和圖片文件等,由于路徑使用不當(dāng)而無(wú)法定位;二是Visual Basic編譯成的.EXE文件并不是實(shí)際意義上的EXE文件,Visual Basic系統(tǒng)中的標(biāo)準(zhǔn)控件和開(kāi)發(fā)過(guò)程中用到的第三方控件,都沒(méi)有包含在內(nèi)。此現(xiàn)象可由圖1形象地加以說(shuō)明。
因此要解決用VB開(kāi)發(fā)的應(yīng)用程序與機(jī)器環(huán)境的相關(guān)性,必須從兩個(gè)方面入手,一是保證應(yīng)用程序能調(diào)用到所用文件,二是應(yīng)用程序發(fā)布時(shí)同時(shí)發(fā)布所有用到的控件和DLL文件。
開(kāi)發(fā)與路徑無(wú)關(guān)的應(yīng)用程序
無(wú)論應(yīng)用程序論開(kāi)發(fā)得多么好,是否成功還取決于其能否在任何機(jī)器的任何目錄下都能運(yùn)行,這就要求應(yīng)用程序要自成一體,不但要包含所有用到的文件,而且還應(yīng)與路徑無(wú)關(guān)。實(shí)現(xiàn)應(yīng)用程序與路徑無(wú)關(guān)可用兩種方法:一是利用VB.APP對(duì)象的PATH屬性;二是把調(diào)用文件放在光盤(pán)上,直接調(diào)用。
1.利用VB.APP.PATH實(shí)現(xiàn)與路徑無(wú)關(guān)
該方法的主要思路是在調(diào)用文件時(shí)利用相對(duì)路徑,由于VB中不支持與DOS類(lèi)似的相對(duì)路徑,如調(diào)用當(dāng)前目錄下的“hh1.bmp”文件,寫(xiě)成“hh1.bmp” 和 “.hh1.bmp“將會(huì)出錯(cuò)。為解決該問(wèn)題,VB提供一個(gè)VB.APP對(duì)象,該對(duì)象有個(gè)名為PATH的屬性,它記下了執(zhí)行文件所在的路徑,可在運(yùn)行時(shí)訪問(wèn)。
用該方法創(chuàng)建與路徑無(wú)關(guān)應(yīng)用程序的要點(diǎn)如下:
。1)為應(yīng)用程序(項(xiàng)目)創(chuàng)建一個(gè)目錄,用以存放建立的窗體或其它文件。
(2)把應(yīng)用程序所調(diào)用的文件放在該目錄下或者放在該目錄的子目錄下。子目錄最好按照引用文件的類(lèi)型進(jìn)行建立,如存放圖片的子目錄名為PIC,存放表的的目錄為DBF等。
。3)除包含在可執(zhí)行文件中的文件(如在設(shè)計(jì)時(shí)圖片框加載的圖片)外的其它文件,調(diào)用一律采用相對(duì)路徑而禁用絕對(duì)路徑。
這樣在復(fù)制應(yīng)用程序的時(shí)候,只要把應(yīng)用程序目錄下的所有文件(包括子目錄)復(fù)制到任意目錄下,應(yīng)用程序都不會(huì)發(fā)生因找不到文件而產(chǎn)生的錯(cuò)誤。
以下是一個(gè)程序?qū)嵗,該?shí)例顯示一系列的角度逐漸變化的地球圖片,從而形成地球轉(zhuǎn)動(dòng)動(dòng)畫(huà)。用VB設(shè)計(jì)一個(gè)窗體,窗體上放置一個(gè)圖片框,名為Image1(Strech=.T.),給窗體加一個(gè)定時(shí)器控件,控件名為T(mén)imer1(Interval=25,enabled=.t.),該項(xiàng)目存放在A:exam下,圖片文件存放在A:EXAM1PIC下面。
使用絕對(duì)路徑,程序代碼如下:
Dim t1 As Integer
Private Sub Form_Load()
t1 = 0 ‘t1 記錄時(shí)鐘事件發(fā)生的次數(shù)
End Sub
Private Sub Timer1_Timer()
t1 = t1 + 1
If t1 < 100 Then ‘圖片共顯示100幅
current = t1 Mod 8
‘current表示當(dāng)前應(yīng)該顯示哪張圖片
FileName$ = "A:exampicearth" && current && ".jpg" ‘圖片文件名(絕對(duì)路徑)
Image1.Picture = LoadPicture(FileName$) ‘顯示圖片
Else
End ‘程序結(jié)束
End If
End Sub
該程序使用絕對(duì)路徑調(diào)用外部文件(earth0.jpg?earth7.jpg),當(dāng)把EXAM目錄全部?jī)?nèi)容拷貝到其它機(jī)器上,抽出軟盤(pán)后,運(yùn)行程序?qū)l(fā)生找不到文件錯(cuò)誤。若采用VB.APP.PATH屬性,把形成圖片文件名的語(yǔ)句改寫(xiě)如下:
FileName$ = VB.App.Path && "picearth" && current && ".jpg" ‘形成顯示圖片的文件名
這樣無(wú)論把exam目錄完全復(fù)制到任何機(jī)器,程序均能運(yùn)行。
2.從光盤(pán)調(diào)用文件實(shí)現(xiàn)與路徑無(wú)關(guān)
把應(yīng)用程序要調(diào)用文件放在光盤(pán)指定目錄下,應(yīng)用程序發(fā)行時(shí)和該光盤(pán)的拷貝一同發(fā)行。程序運(yùn)行時(shí),直接從光盤(pán)指定目錄調(diào)用文件,故不會(huì)發(fā)生因找不到文件而出現(xiàn)的錯(cuò)誤。由于不同機(jī)器上的光盤(pán)盤(pán)符不同,因此在開(kāi)發(fā)時(shí)不能直接引用光盤(pán)的盤(pán)符,應(yīng)用程序必須要先取得光盤(pán)盤(pán)符,然后再生成需要調(diào)用文件的完整文件名。
取得光驅(qū)盤(pán)符可以使用API函數(shù),也可以通過(guò)以下程序段來(lái)檢測(cè)到光驅(qū)盤(pán)符:
Private Declare Function GetDriveType Lib "kernel32"
Alias "GetDriveTypeA" (ByVal nDrive As String) As Long ‘聲明 API函數(shù)
Dim drive As String
Dim a As Long
For i = 0 To 25
drive = Chr(65 + i) && ":" ‘形成盤(pán)符符號(hào)
a = GetDriveType(drive)
‘得到盤(pán)符常數(shù)
If a = 5 Then
Exit For
‘如果是光驅(qū)則退出
End If
Next
以上程序段放在需要檢測(cè)光驅(qū)的地方,通常放在Form.load事件中,光驅(qū)盤(pán)符存放在Drive變量中。檢測(cè)到光驅(qū)后,則可直接調(diào)用光盤(pán)上的文件,如上例中,若PIC目錄下的圖片文件存放在光盤(pán)上,形成文件名的語(yǔ)句則可以用以下語(yǔ)句代替:
FileName$ = Drive && "exampicearth" && current && ".jpg" ‘形成顯示圖片的文件名
這樣,我們就實(shí)現(xiàn)了從光盤(pán)調(diào)用文件與路徑無(wú)關(guān)了。
包裝應(yīng)用程序?qū)崿F(xiàn)與系統(tǒng)無(wú)關(guān)
解決了與文件路徑相關(guān)的問(wèn)題后,生成的可執(zhí)行文件在其它沒(méi)有安裝Visual Basic的機(jī)器中,依然無(wú)法執(zhí)行。原因之一是Visual Basic具有21個(gè)標(biāo)準(zhǔn)控件,這些控件都保存在動(dòng)態(tài)鏈接庫(kù)中(擴(kuò)展名為DLL),Visual Basic的可執(zhí)行程序中并沒(méi)有包含;原因之二是開(kāi)發(fā)的應(yīng)用程序可能包含了第三方控件,Visual Basic的可執(zhí)行程序中也不包含它們。因此在其它機(jī)器上執(zhí)行VB開(kāi)發(fā)的應(yīng)用程序,必須使該機(jī)器包含程序中所有用到的動(dòng)態(tài)鏈接庫(kù)和控件文件(OCX或VBX文件),并需要把它們?cè)赪indows中加以注冊(cè)。
為了減少拷貝和注冊(cè)DLL、OCX和VBX給用戶(hù)帶來(lái)的麻煩,VB自帶了一個(gè)包裝程序,利用它給應(yīng)用程序打包,生成安裝盤(pán)。包中可以包含應(yīng)用程序相關(guān)文件、DLL文件、OCX文件、VBX文件等。要把程序包安裝到某臺(tái)機(jī)器上時(shí),只需在該機(jī)器上執(zhí)行Setup程序即可,由Setup程序自動(dòng)完成相應(yīng)的DLL、OCX和VBX文件的拷貝和注冊(cè)。
應(yīng)用程序與機(jī)器環(huán)境無(wú)關(guān)性測(cè)試方法
要保證程序的機(jī)器環(huán)境的無(wú)關(guān)性,必須要進(jìn)行嚴(yán)格測(cè)試。但由于在開(kāi)發(fā)機(jī)器上,所有調(diào)用的文件都實(shí)際存在,DLL、OCX和VBX等文件存在并且已經(jīng)注冊(cè),所以無(wú)法進(jìn)行程序的機(jī)器環(huán)境無(wú)關(guān)性測(cè)試。測(cè)試只能在其它機(jī)器上進(jìn)行,可以分成以下幾步:
。1)另找一臺(tái)只安裝了Windows系統(tǒng)而沒(méi)有安裝任何其它軟件的機(jī)器,且只有Windows系統(tǒng)子目錄。
。2)在該機(jī)器上解包并執(zhí)行程序。
(3)若執(zhí)行無(wú)誤則進(jìn)入下一步,否則該軟件需根據(jù)提示進(jìn)行修改。該步驟保證了調(diào)用DLL、OCX和VBX的正確性,但并不能保證與路徑無(wú)關(guān)。
。4)改變應(yīng)用程序的安裝目錄再進(jìn)一步驗(yàn)證路徑無(wú)關(guān)性,若無(wú)誤進(jìn)入下一步,否則該軟件需根據(jù)提示進(jìn)行修改。該步驟保證軟件自帶文件的調(diào)用正確性。
。5)另找一臺(tái)只安裝了Windows系統(tǒng)的機(jī)器,Windows系統(tǒng)子目錄與前臺(tái)機(jī)器不一樣,然后重復(fù)以上步驟,若無(wú)誤說(shuō)明該軟件已經(jīng)達(dá)到了機(jī)器環(huán)境無(wú)關(guān)性的要求。否則該軟件需根據(jù)提示進(jìn)行修改。該步驟保證軟件絕對(duì)沒(méi)有調(diào)用任何沒(méi)有自帶的外部文件。
應(yīng)用程序的系統(tǒng)無(wú)關(guān)性是軟件成敗的一個(gè)重要因素,是程序設(shè)計(jì)中需要詳細(xì)規(guī)劃的一個(gè)重要方面,同時(shí)也是程序調(diào)試的一個(gè)重點(diǎn)內(nèi)容。本文討論的方法,稍加修改亦可適用于其它開(kāi)發(fā)工具。