制作安裝程序往往是程序設(shè)計的最后一步,同時也是重要的一步,因為運行安裝程序往往是用戶的第一個操作。有不少讀者詢問這方面的問題,《答疑解惑》將分兩期介紹一些制作Visual Basic安裝程序時常遇到問題的解決方法。
問題:假如我用VB 5開發(fā)的程序很簡單,只用到了 ShellExecute()這個API函數(shù)及Command Button,我能不能不做安裝盤,使其在所有客戶機上(Win 95/98/NT)都能正常使用?如不制作安裝程序,與EXE放在一起的應(yīng)該包括哪些文件?
答:對于一個非常簡單的VB 5程序,沒有使用額外的OCX控件,在Win 98/2000下是可以正常運行的(不需要制作安裝盤)。因為Win 98/2000帶有VB 5程序所需要的DLL文件。但在Win 95/NT 4.0下一般是不行的,因為缺少必要的文件。如果用戶的機器上安裝有IE 4.0/5.0,那么應(yīng)該也是可以不制作安裝盤的。在一般情況下,不制作安裝盤就不能保證程序的正確運行。
你制作的安裝盤所包括的DLL中,除了Vb5stkit.dll只是安裝時使用、安裝后就不需要了,其它DLL都是不可缺少的。雖然對于某些機器而言,由于安裝過其它軟件,可能不需要某個DLL,但要想在所有的機器上都能正確運行,一個文件都不能少。所以為了避免由于缺少某個文件或注冊不正確而使程序無法運行,我建議你還是制作安裝盤比較保險。
如果你的程序是放在網(wǎng)上供別人下載的,為了減少下載文件的大小,可以這樣做:將你的程序單獨打成一個包,如果用戶已經(jīng)有了運行VB 5程序所需要的有關(guān)文件,就只需下載你的程序;然后,在網(wǎng)頁上提供一個VB 5的運行時間庫的鏈接(如http://download.microsoft.com/download/vb50pro/utility/1/win98/EN-US/Msvbvm50.exe),如果用戶的機器上沒有這些文件,則讓他單獨下載運行庫。這是一種比較通行的方法。
問題:若在一個程序中使用了其它控件, 如何在沒有注冊該控件的機器上運行, 是不是一定要制作安裝程序或注冊該控件呢?
答:在Win 95/98下,如果你的控件和EXE文件在同一個目錄中,或者控件文件放置在System目錄中,EXE程序運行時會自動找到所需要的OCX文件并注冊。但是這種方法在Win NT下不適用,NT下必須先注冊控件才能保證EXE文件的正常運行。另外,這種自動注冊有一些毛病,如果機器已經(jīng)存在一個低版本的控件,自動注冊可能會失敗。所以,如果你希望自己的程序能夠非常好地工作,最好還是制作安裝程序,否則可能會有麻煩。
問題:請介紹一下如何利用VB 6給自己的軟件加上像商業(yè)軟件一樣的卸載功能?
答:VB 6的安裝向?qū)е谱鞯陌惭b程序本身包括卸載功能,不過這個功能并不出現(xiàn)在“開始”選單中。安裝后,要進行卸載工作,可以打開“控制面板”,點擊“安裝/刪除程序”圖標,然后選擇想要卸載的軟件。
如果希望在選單中添加卸載程序選項,可以在制作安裝程序包時加入相應(yīng)的程序項。VB 6的“Package & Deployment 向?qū)?#8221;支持安裝程序創(chuàng)建自己的程序組和選單項。在“Package & Deployment 向?qū)?#8221;的“啟動選單項”一步(圖1),選擇“新建項”按鈕,此時會出現(xiàn)一個對話框。在對話框的 “名稱”文本框中輸入選單項的名稱,如“卸載VBTerm”。在“目標”框中輸入卸載項的命令為:$(WinPath)st6unst.exe -n ″$(AppPath)ST6UNST.LOG″ 。然后選擇確定關(guān)閉該對話框。這樣生成的安裝程序中將包括一個卸載程序的選單項。
圖1 在啟動選單項中添加一個卸載項
問題:本人用VB 6.0制作了一個程序,但在某個機器上安裝時,會出現(xiàn)以下錯誤:
1. “system error &H80004005(02147467259)未指定錯誤”
2.“can not found ′c:windows empmsftqws.pdwst6unst.ext′”
3.無法開始系統(tǒng)安裝程序。
請問原因?
答:這是由于VB 6的一個Bug導致的,你可以升級到VB 6 SP3(從http://msdn.microsoft.com/vstudio/sp/default.asp下載),在這個升級版本中修復了這個錯誤。
問題:本人用VB 6制作了一個程序,但在安裝該軟件時系統(tǒng)報告:
錯誤: 在′C:WINDOWSSYSTEMeXPsrv.dll′中未發(fā)現(xiàn)DllRegisterServer() 的WINDOWSSYSTEMexpsrv.dll″輸入點;在本操作期間: DllSelfRegister: ″C:;錯誤: 注冊文件 ′C:WINDOWSSYSTEMexpsrv.dll′時出錯;錯誤: (用戶響應(yīng)′忽略′)。
忽略錯誤后安裝完成。在Windows 98下安裝也有同樣的問題。
答:DLL有兩種,一種是標準DLL,另一種是ActiveX DLL。前者拷貝到用戶機器上就可以工作了,而后者還需要調(diào)用DLL中的DllRegisterServer或者使用RegSvr32進行注冊才能使用。你可以打開VB98WizardsPDWizardVB6dep.ini文件。下面是這個文件的片斷:
[ExpSrv.dll]
Dest=$(WinSysPathSysFile)
CABFileName=MSJet35.cab
CABDefaultURL=http://activex.microsoft.com/controls/vb6
CABINFFile=MSJet35.inf
[MSRD2x35.dll]
Dest=$(WinSysPathSysFile)
Register=$(DLLSelfRegister)
CABFileName=MSJet35.cab
CABDefaultURL=http://activex.microsoft.com/controls/vb6
CABINFFile=MSJet35.inf
可以看到MSRD2x35.dll比ExpSrv.dll多一行Register=$(DLLSelfRegister),這是因為MSRD2x35.dll是ActiveX DLL。ExpSrv.dll是普通的DLL,沒有DllRegisterServer,也用不著注冊。你所遇到的問題是VB 6的一個Bug(在VB 6 SP3中已經(jīng)修復)。如果你的VB6dep.ini文件的ExpSrv.dll多了Register一行,應(yīng)該刪除?;蛘叽蜷_安裝程序的Setup.lst,刪除其中ExpSrv.dll一行中的“$(DLLSelfRegister)”字樣。
問題:我在做成安裝文件后,安裝過程中系統(tǒng)缺省的目錄是C:Program FilesTele,而我需要的是C:Tele2000,請問有辦法修改嗎?
答:要修改安裝程序的缺省目錄,可以打開安裝盤的Setup.lst文件,在這個文件中可以找到下面一行:
DefaultDir=$(ProgramFiles) ele
將這行中的“$(ProgramFiles) ele”修改為你想要的目錄(如C:Tele2000)就可以了。
問題:用VB 5的安裝向?qū)е谱鞯某绦虬惭b包里,總有一個.dep文件,請問這個文件有什么用?是否與OCX注冊有關(guān)?如何打開?如何編輯?
答:只有當你為ActiveX控件制作安裝包的時候,才會出現(xiàn).dep文件。這個文件主要是供使用你的ActiveX控件的程序設(shè)計者制作他自己程序的安裝盤時使用的。你的用戶在使用Setup Wizard制作安裝盤時,Setup Wizard會讀取這個文件,檢查你的ActiveX控件需要哪些DLL支持。一般不用手工修改這個文件,如果你認為確有必要,可以使用記事本打開修改。
問題:我用VB+Access開發(fā)數(shù)據(jù)庫系統(tǒng)。但到發(fā)布時用VB自已的發(fā)布向?qū)r,我程序目錄中的子目錄的文件卻加入不正常,向?qū)Р话醋幽夸泤^(qū)分,而是將所有文件都加到程序目錄中。怎么辦?
答: VB的安裝向?qū)侵С种谱靼ㄗ幽夸浀陌惭b程序的。運行安裝向?qū)У?#8220;文件小節(jié)”一步,在對話框中選擇“添加”按鈕,然后選擇應(yīng)該放置在子目錄中的文件添加到文件列表中。
然后從文件列表中選擇該文件,點擊 “文件詳細資料”按鈕。在圖3所示對話框中設(shè)置目標路徑。最好不要用絕對路徑(如C:MyProject)來指定安裝位置,這樣會給用戶帶來不便。安裝向?qū)褂煤陙碇甘疚募惭b的位置。這些宏只在安裝程序中有效。宏的含義參見表1。如果要將文件放置在應(yīng)用程序目錄下的Data子目錄下,可以使用$(AppPath)Data來指定安裝路徑。
問題:安裝時,用VB自己的“展開與打包向?qū)?#8221;制作的安裝盤,不知道怎么讓程序在桌面上放一個快捷方式?
答:VB“展開與打包向?qū)?#8221;所生成的安裝程序的工作步驟是這樣的:先運行Setup.exe,這個程序?qū)B的運行庫安裝到用戶的機器上,同時將.cab文件中的文件釋放到臨時目錄中,然后再調(diào)用臨時目錄中Setup1.exe完成余下的安裝工作。Setup1.exe是由VB寫的(正是這個原因所以要先安裝VB的運行庫),其源程序可以在VB98WizardsPDWizardSetup1中找到。如果你對VB的安裝程序不滿意,希望添加新功能,可以直接修改Setup1.vbp。具體到你的問題,在VB中可以打開Setup1.vbp,然后修改Setup1.frm的Form—Load事件,在其中可以找到如下幾行:
′ ′ Create program icons (or links, i.e. shortcuts).
′ If (fMainGroupWasCreated = True) Or ((cIcons > 0) And TreatAsWin95()) Then
ShowStaticMessageDialog ResolveResString(resPROGMAN)
CreateIcons gsICONGROUP
′Do the same for other sections in SETUP.LST if you′ve added your own.
′CreateIcons ″MySection″
′CreateIcons ″MyOtherSection″
End If
在If.. End If中加上:
OSfCreateShellLink ″....Desktop″, _
″我的程序″, gstrDIR—DEST+″MyProg.exe″, ″ ″
重新編譯Setup1.vbp,用Setup1.exe替換掉原來的Setup1.exe即可。
問題:我用VB 5.0安裝向?qū)傻陌惭b程序,安裝到最后時總是顯示“文件C:WindowsSystem$(DllSelfRegisterEx)不能被注冊,由于它未找到”的提示信息后安裝失敗,請問原因?
答:這是VB 5.0/6.0的一個Bug。
如果運行Visual Basic 5.0生成的安裝盤,會產(chǎn)生下面的錯誤:
The file ′ 如果運行Visual Basic 6.0生成的安裝盤,會產(chǎn)生下面的錯誤: The file ′ 這個問題發(fā)生在分發(fā)Microsoft Calendar control(MSCal.ocx)時。MSCal.dep文件中的"Register="行被錯誤地設(shè)置成 $(DLLSelfRegisterEx)了。 解決辦法如下: 1. 使用記事本打開Setup.lst文件。Setup.lst文件是Setup Wizard或PDW制作安裝盤時生成的。 2. 查找$(DLLSelfRegisterEx)。你將看到在MSCal.ocx的一行中有$(DLLSelfRegisterEx)。 3. 修改 $(DLLSelfRegisterEx) 為$(DLLSelfRegister)。 4. 關(guān)閉記事本并保存文件。 5.運行Setup.exe。 如果希望今后生成的Setup.exe都不出這樣的錯誤,可以這樣做: 1. 使用記事本打開MSCal.dep文件。你可以在MSCal.ocx所在的目錄(通常是Windows 95/98的WindowsSystem或Windows NT的WinntSystem32)找到MSCal.dep文件。 2. 查找$(DLLSelfRegisterEx)。你將可以在“Register=”一行看到$(DLLSelfRegisterEx)。 3. 修改 $(DLLSelfRegisterEx) 為$(DLLSelfRegister)。 4. 關(guān)閉記事本并保存文件。