認(rèn)識InstallShield12
進入公司以來,頭一件工作就是接手了公司所有系統(tǒng)平臺的打包安裝工作,從做這件工作到現(xiàn)在已經(jīng)有一段時間了,趁著晚上這點閑暇時間,總結(jié)一下。
記得剛開始聽到InstallShield時,竟不知其為何物!后來纏著InstallShield過了差不多一周時間,才漸漸有了入門的感覺。而今,打包安裝工作已經(jīng)成為日常工作之一了,每天花上不到半個小時的時間即可完成多個安裝包的制作及相應(yīng)升級包的制作。說到這里,特別準(zhǔn)備了幾個部分,也來說說利用InstallShield12制作安裝包的一些方法技巧。今天是第一部分,認(rèn)識InstallShield12(其實市面上已經(jīng)有InstallShield2009、InstallShield2010了,只不過本人使用的是InstallShield12,故拿其作為例子)。
在介紹InstallShield12之前,或許很多使用InstallShield工具打包的朋友都應(yīng)該很清楚,InstallShield方面的高級資料較少,一般的來源可以從InstallShield中文技術(shù)論壇(http://installshield.jaron.cn/forum/)、InstallShield公司的社區(qū)網(wǎng)站(http://community.flexerasoftware.com/)及英文版的幫助文檔找到部分資料。不過,說實在的,真正有幫助的還是相對較少,這其中可能就需要自己去挖掘了。
關(guān)于InstallShield12,首先,我們先來看看新建一個InstallScript Project后的界面示意圖,如圖1.1所示:
圖1.1
在圖1.1中,這是一個向?qū)降闹谱靼惭b包的全過程,如果制作簡單的安裝包,那么使用這個向?qū)нM行Step by step的方式就可以了,而如果要制作較為復(fù)雜的安裝包或升級包,那么就需要用到Installation Designer面板中的相關(guān)操作了,這個在后面再進行闡述。
我們先來看看在Project Assistant面板中每一項的功能:
(1)Application Information:設(shè)置安裝包的一些基本信息,如公司名稱、安裝包名稱、安裝包版本號、公司網(wǎng)站地址等;
(2)Installation Architecture:設(shè)置安裝包的主體結(jié)構(gòu),一般用來設(shè)置安裝包中有多少個安裝項目;
(3)Application Files:指定安裝文件路徑及所需的安裝文件夾,在這一步可以通過Add Files或者Add Folders將文件或文件夾添加到指定位置,如Application Target Folder或Program Files或Windows System下等,關(guān)于這其中的一些存放目錄的區(qū)別會在后面進行說明;
(4)Application Redistributables:用于添加第三方組件;
(5)Application Shortcuts:創(chuàng)建程序啟動的快捷方式,如開始菜單快捷方式、桌面快捷方式等;
(6)Application Registry:對注冊表進行操作;
(7)Installation Interview:一些簡單的對話框選擇操作,如使用協(xié)議、公司名用戶名等;
(8)Installation Localization:安裝包界面語言的選擇;
(9)Build Installation:選擇安裝包的格式并編譯成安裝包,如*.exe文件等;
以上是對Project Assistant面板中每一步的基本功能進行了簡單的說明,通過這個向?qū)В纯赏瓿梢粋€簡單的安裝包制作。
下面我們再來看看Installation Designer面板,如圖1.2所示:
圖1.2
在圖1.2中,可以看到,該界面其實就是對Project Assistant面板的細(xì)化,對其中的部分功能說明如下:
(1)Installation Information->Project Properties->Setup Languages:設(shè)置安裝包的語言種類,可以設(shè)置多種語言,在運行安裝包時會出現(xiàn)安裝語言選擇界面;
(2)Installation Information->Project Properties->Add or Remove Programs->Disable Change Button:隱藏該安裝包在添加刪除程序列表中的更改按鈕;
(3)Installation Information->Project Properties->Add or Remove Programs->Disable Remove Button:隱藏該安裝包在添加刪除程序列表中的刪除按鈕。
(4)Organization->Feature:特征,每個Feature可包含子Feature及若干個Component,每個Feature都會出現(xiàn)在Feature選擇界面中,一旦Feature被選擇安裝其包含的Component就會被安裝到系統(tǒng)中去;
(5)Organization->Component:組件,每個Component可設(shè)置需要安裝的文件、寫入的注冊表信息、創(chuàng)建的快捷方式等等;通常在這里指定是否卸載、是否注冊、安裝策略(如果遇到舊版本是全部覆蓋還是部分覆蓋,是先版本后時間覆蓋還是只按版本高低覆蓋等);
(6)Organization->Setup Type:安裝類型,一般默認(rèn)有Minimal(壓縮)、Typical(典型)、Custom(自定義),每種安裝類型包含若干個Feature;
(7)Organization->Setup Design:設(shè)置Features、Components(組件)及Files(安裝文件)等等。
(8)Application Data->Files and Folders:管理安裝文件夾及文件,基本上每次打包都要使用;
(9)Application Data->Objects:選擇需要安裝的系統(tǒng)運行庫。
(10)System Configuration->Shortcuts:創(chuàng)建快捷方式;
(11)System Configuration->Registry:向注冊表中添加鍵值;
(12)System Configuration->XML File Changes:添加或更改XML文件。
(13)Server Configuration->Internet Infosmation Services:配置IIS網(wǎng)站及虛擬目錄;
(14)Server Configuration->SQL Scripts:配置數(shù)據(jù)庫,可以支持Microsoft SQL Server, MySQL, and Oracle數(shù)據(jù)庫;
(15)Behavior and Logic->InstallScript:編寫安裝程序的腳本,這是制作復(fù)雜的基于InstallScript的安裝包的最常使用的部分;
(16)Behavior and Logic->Support Files/Billboards:添加安裝過程中需要的文件及安裝背景;
(17)User Interface->Dialogs:編輯安裝過程中使用的窗體,在InstallShield12中不包含準(zhǔn)備安裝窗體和復(fù)制文件窗體,所以如果要編輯這兩個窗體的界面是很難辦到的,至少是不完美的。
(18)Media->Path Variables:編輯安裝路徑變量;
(19)Media->Releases:制作安裝媒體。
(20)Additional Tools->Dependency Scanners:搜索工具;
(21)Additional Tools->Direct Editor:命令編輯器,在這里可以查看或編輯安裝程序的各類信息。
通過上面的基本描述,要制作一個安裝包,通過最常用的是Installation Information、Organization->Component、Organization->Setup Type、Application Data->Files and Folders、System Configuration->Shortcuts、Behavior and Logic->InstallScript、Media->Releases等部分。
此外,在這里還需要再簡單說明一下Application Files中幾個目錄的區(qū)別,首先是Application Target Folder,該目錄表示安裝包在目標(biāo)系統(tǒng)中要安裝的目錄,其根目錄可在InstallScript腳本中編寫,而用戶則可以在安裝過程中進行選擇并安裝到用戶想要的目錄;Program Files表示目標(biāo)系統(tǒng)的系統(tǒng)磁盤的Program Files目錄,是不允許更改的;Program Files(64-bits)是針對64位系統(tǒng)而言的;Support Folder通常用來存放幫助文檔等;Fonts Folder是指目標(biāo)系統(tǒng)的系統(tǒng)磁盤的字體文件夾目錄;Windows System表示的是目標(biāo)系統(tǒng)的系統(tǒng)磁盤的Windows System目錄,如Windows XP的system32目錄,也是不允許更改的;Windows System(64-bits)是針對64位系統(tǒng)而言的。
OK,認(rèn)識InstallShield12就先到這里,在下面的內(nèi)容中,將會跟各位談?wù)処nstallScript腳本的編寫等問題。
利用InstallScript腳本進行最基本的編程
在公司負(fù)責(zé)打包安裝這份日常工作,同時還負(fù)責(zé)系統(tǒng)或平臺的升級,鑒于公司產(chǎn)品在升級方面要求的特殊性(在B/S上升級C/S程序),本人經(jīng)過將近一個月的努力,完成了公司產(chǎn)品從最原始的手動升級到半自動化的升級工作,這其中除了需要自己編寫升級程序之外,同時還需要結(jié)合升級包做相應(yīng)的工作。
在做安裝包或升級包的過程中,很大一部分工作靠InstallScript腳本完成,在這里作簡單的總結(jié)。
首先,想必接觸過InstallShield的朋友都非常清楚,IS有很多的固定函數(shù),這些函數(shù)在安裝的不同階段分別執(zhí)行,比如OnFirstUIBefore、OnFirstUIAfter、OnEnd等。這里需要強調(diào)的是,IS函數(shù)的執(zhí)行順序跟顯示順序是無關(guān)的,其執(zhí)行順序是已經(jīng)固化的。
我們可以通過腳本來實現(xiàn)安裝界面的增加或減少,比如我們想去掉許可協(xié)議界面,那么可以刪掉或注釋掉OnFirstUIBefore函數(shù)中的Dlg_SdLicense2:下的這段代碼:
/*
Dlg_SdLicense2:
szTitle = "";
szOpt1 = "";
szOpt2 = "";
//{{IS_SCRIPT_TAG(License_File_Path)
szLicenseFile = SUPPORTDIR ^ "License.rtf";
//}}IS_SCRIPT_TAG(License_File_Path)
//{{IS_SCRIPT_TAG(Dlg_SdLicense2)
nResult = SdLicense2Rtf( szTitle, szOpt1, szOpt2, szLicenseFile, bLicenseAccepted );
//}}IS_SCRIPT_TAG(Dlg_SdLicense2)
if (nResult = BACK) then
goto Dlg_SdWelcome;
else
bLicenseAccepted = TRUE;
endif;
*/
關(guān)于各個函數(shù)的用法,可以查看InstallShield的幫助文檔,亦可以到網(wǎng)上搜索“InstallShield內(nèi)部庫函數(shù)”,這里不作詳述。
下面,跟大家分享一些本人在做安裝包和升級包過程中所學(xué)習(xí)或摸索到的一些小技巧。
(1)檢測操作系統(tǒng)是否為Windows Vista
if (SYSINFO.WINNT.bWinVista) then
if (SYSINFO.nOSProductType = VER_NT_WORKSTATION) then
// 當(dāng)前操作系統(tǒng)為Windows Vista
endif;
endif;
(2)注冊表操作
讀取注冊表采用RegDBGetKeyValueEx (szKey, szNumName, nType, svvalue, nSize )函數(shù),寫入注冊表采用RegDBSetKeyValueEx (szKey, szNumName, nType, szNumValue, nSize)函數(shù),刪除注冊表項采用RegDBDeleteKey ( szSubKey )函數(shù),刪除注冊表項中某一個鍵值采用RegDBDeleteValue ( szSubKey, szValue )函數(shù),等等。所有這些都可以方便地通過InstallShield的幫助文檔找到相應(yīng)的使用說明。需要說明的是,如果有多個地方需要進行讀注冊表或?qū)懽员聿僮?,那么建議將這個方法寫成一個自定義的函數(shù),在需要使用的地方就可以非常方便地調(diào)用了。另外,還需要注意的是不要忘了在讀注冊表或?qū)懽员淼炔僮髦凹由线@句RegDBSetDefaultRoot (HKEY_LOCAL_MACHINE),當(dāng)然也不用每個地方都加,在一個函數(shù)體內(nèi)只需加一個就夠了,而對于特殊情況當(dāng)然是特殊處理了。
(3)安裝完成前執(zhí)行指定文件
通常,在安裝完成之前需要執(zhí)行指定的文件,如為防止某些文件注冊不成功,采用批處理方式進行再一次的注冊,這時可以寫一個批處理文件*.bat,然后通過如下面的語句執(zhí)行一下即可:
sProgramme_name = WINSYSDIR ^"\\myReg.bat";
szCmdLine = "";
if LaunchAppAndWait(sProgramme_name, szCmdLine, WAIT) < 0 then;
endif;
(4)隱藏安裝文件復(fù)制界面
可以在OnMoving函數(shù)中編寫一行代碼:Disable(STATUSOLD)即可實現(xiàn)。
(5)檢測磁盤空間是否足夠于安裝
當(dāng)安裝包非常大時,我們通常要考慮目標(biāo)計算機的執(zhí)行磁盤分區(qū)是否有足夠的空間來順利完成安裝,在這里可以通過GetDisk (szDir, svDrive)、GetDiskSpace (svDrive)函數(shù)進行粗略的估算,如下:
GetDisk (szDir, svDrive);
lFreeSpace = GetDiskSpace (svDrive);
if (lFreeSpace < 314572800) then
MessageBoxEx("警告:本安裝所需磁盤空間最低約為300M,安裝路徑所在的磁盤空間不足!請重新選擇!","警告",WARNING);
goto Dlg_SdAskDestPath;
endif;
上述代碼一般放到OnFirstUIBefore函數(shù)的Dlg_SdAskDestPath中。
(6)創(chuàng)建并寫數(shù)據(jù)到文件
有時,為適應(yīng)實際需要,我們需要在安裝過程中創(chuàng)建一個配置文件(如Config.dat),并將一些初始化數(shù)據(jù)寫入該文件中,這時就需要用到CreateFile函數(shù),例程如下:
/* 創(chuàng)建配置文件并寫入初始化配置參數(shù) */
szConfigDir = TARGETDIR ^"\\Test\\Start";
szConfigPath= TARGETDIR ^"\\Test";
szConfigFile = "Config.dat";
// 以FILE_MODE_APPEND 方式打開文件
OpenFileMode (FILE_MODE_APPEND);
// 創(chuàng)建配置文件并打開該文件
if (CreateFile (nvFileHandle, szConfigDir, szConfigFile) < 0) then
MessageBox ("創(chuàng)建配置文件失敗,安裝程序?qū)⒔K止!", SEVERE);
abort;
else
// 將配置數(shù)據(jù)寫入配置文件
szMsg = "[INIT]\n1="+ szConfigPath;
if (WriteLine(nvFileHandle, szMsg) < 0) then
MessageBox ("寫入配置參數(shù)失敗,安裝程序?qū)⒔K止!", SEVERE);
abort;
endif;
endif;
CloseFile (nvFileHandle); //關(guān)閉文件
以上都是一些最基本的腳本代碼,要寫好InstallScript腳本,需要在實際工作學(xué)習(xí)過程中多鉆研、多去發(fā)現(xiàn)。只要用心,有時候還是可以在InstallShield的技術(shù)社區(qū)找到一些我們想要的東西,并且會時不時地帶給我們一些意外的驚喜。
判斷操作系統(tǒng)類型的多種方法
用InstallShield制作安裝包時,有時候需要判斷操作系統(tǒng)的類型(如Windows XP或者是Windows Vista等),本人通過上InstallShield的官方社區(qū)(http://community.flexerasoftware.com/)找到了一些解決辦法,現(xiàn)將本人整理過的方法曬出來,與各位一起分享。
方法一:采用注冊表的方式進行判斷,例程如下:
NUMBER nOS,nvResult;
STRING svOS;
nOS = REGDB_NUMBER;
RegDBSetDefaultRoot( HKEY_LOCAL_MACHINE );
RegDBGetKeyValueEx( "SOFTWARE//Microsoft//Windows NT//CurrentVersion","CurrentVersion", nOS, svOS, nvResult);
if (svOS == "6.0") then
MessageBox("We are on Vista!", INFORMATION);
else
if (svOS == "5.1") then
MessageBox("We are on XP!",INFORMATION);
endif;
endif;
方法二:采用GetSystemInfo函數(shù)進行處理,請看下面的說明信息:
SYSINFO.nWinMajor:
4 The operating system is Windows NT 4.0.
5 The operating system is Windows Server 2003 R2, Windows Server 2003, Windows XP,or Windows 2000.
6 The operating system is Windows Vista or Windows Server 2008.
SYSINFO.nWinMinor:
0 The operating system is Windows Vista, Windows Server 2008, Windows 2000, or Windows NT 4.0.
1 The operating system is Windows XP.
2 The operating system is Windows Server 2003 R2, Windows Server 2003, or Windows XP Professional x64 Edition.
GetSystemInfo(WINMINOR, nvResult, svResult);
GetSystemInfo(WINMAJOR, nvResult, svResult);
方法二可以通過InstallShield的幫助文檔找到更詳細(xì)的信息。
方法三:通過SYSINFO.WINNT的方法進行判斷,例程如下:
if (SYSINFO.WINNT.bWinVista) then
if (SYSINFO.nOSProductType = VER_NT_WORKSTATION) then
// 當(dāng)前操作系統(tǒng)為Windows Vista
endif;
endif;
if (SYSINFO.WINNT.bWinXP) then
當(dāng)前操作系統(tǒng)為Windows XP
endif;
上述三種方法是最為常見的解決辦法,當(dāng)然亦可能還有其他的方法可以進行處理。
隱藏準(zhǔn)備安裝界面
使用InstallShield12制作安裝包、升級包的這段時間以來,一直希望能夠在安裝界面上做點工作,使得安裝界面能夠更加符合產(chǎn)品應(yīng)用的實際需求,不過因為資料少及經(jīng)驗不足等原因,一直未能如愿。這兩天,在打包過程中,終于發(fā)現(xiàn)了一點符合應(yīng)用的小技巧,特別拿出來分享。
安裝包、升級包的要求中有這么一條:需要將準(zhǔn)備安裝界面隱藏。在查看了InstallShield12的幫助文檔及相關(guān)資料后,可以通過設(shè)置CommandLine參數(shù)順利實現(xiàn)。具體是在Installation Designer->Media->Releases->SINGLE_EXE_IMAGE->Setup Command Line加上/hide_progress即可,如下圖:
如果要隱藏整個安裝過程,那么將上述的命令改為/s hide_progress即可。
此外,我們通常希望去掉InstallShield Wizard字樣,本人看過不少資料,亦按照這些資料中所講的方法嘗試過多次,可惜的是均不能完全實現(xiàn)這一點,部分還是可以去掉的,比如在string tables里面將InstallShield Wizard替換成自己想要的文字(如安裝向?qū)В缦聢D:
同時,可以通過Edit指定對話框,對所需要的對話框做適當(dāng)?shù)男薷?,比如修改安裝界面左側(cè)的圖片等。當(dāng)然如果修改了對話框,則在我的印象中,對安裝包更換皮膚的話,已修改過的界面將保持修改狀態(tài),而不會跟著更換皮膚。
由于打包安裝工作純屬本人的日常工作,而非本人的工作重心,所以平時在打包安裝方面所花的時間和精力相對不足,還有不少地方未能花上足夠的時間去深入研究,比如能否根據(jù)自己的需求定制每一個安裝界面等,如果哪位朋友有這方面的經(jīng)驗,不吝賜教。
常見系統(tǒng)DLL/OCX控件信息匯集
利用InstallShield制作安裝包/升級包時,常常需要對控件進行分類,如劃分為系統(tǒng)需要注冊的控件、系統(tǒng)不需要注冊的控件等類別,這就對打包安裝開發(fā)人員提出了較高的要求,需要自己去判斷哪些文件需要注冊而哪些文件不需要注冊等等。在這里,結(jié)合本人在打包安裝工作中遇到的問題,將一些常見的與系統(tǒng)相關(guān)的或第三方DLL/OCX控件信息整理了一下,與各位朋友分享,如果有錯誤之處,歡迎指出。
序號 |
DLL文件 |
DLL名稱 |
描述 |
屬于 |
系統(tǒng)DLL |
是否需要注冊 |
安全等級(0-5) |
1 |
asycfilt.dll |
Microsoft OLE DLL |
Microsoft OLE (對象鏈接和嵌入)特性相關(guān)DLL文件 |
OLE |
是 |
是 |
0 |
2 |
comcat.dll |
Microsoft Component Category Manager Library |
Microsoft Component Category Manager Library |
Microsoft® Windows® Operating System |
否 |
是 |
0 |
3 |
gapi32.dll |
Microsoft Mail Configuration Library |
微軟郵件協(xié)議相關(guān)文件 |
Microsoft Exchange |
否 |
是 |
0 |
4 |
msvbvm60.dll |
VB Virtual Machine |
微軟Microsoft Visual Basic虛擬機相關(guān)模塊 |
Visual Basic |
否 |
是 |
0 |
5 |
oleaut32.dll |
Microsoft OLE DLL |
對象鏈接與嵌入OLE相關(guān)文件 |
Microsoft OLE DLL |
否 |
是 |
0 |
6 |
olepro32.dll |
Microsoft OLE Property Support DLL |
對象鏈接和嵌入OLE特性相關(guān)模塊 |
Microsoft OLE Property Support DLL |
是 |
是 |
0 |
7 |
riched32.dll |
RichEdit DLL |
字符編輯器相關(guān)文件 |
RichEdit |
否 |
是 |
0 |
8 |
richtx32.ocx |
Microsoft Rich Text OLE Control |
微軟Microsoft字符編輯器控制相關(guān)程序,用于字符對話框?qū)ο蟾呒壘庉?/SPAN> |
Visual Basic |
否 |
是 |
0 |
9 |
vb6stkit.dll |
Visual Basic Setup Toolkit Library DLL |
Visual Basic應(yīng)用程序接口API相關(guān)文件 |
Visual Basic |
否 |
是 |
0 |
10 |
mscomctl.ocx |
Windows Common Controls ActiveX Control DLL |
公用ActiveX插件控制模塊 |
Windows ActiveX |
是 |
是 |
0 |
11 |
comdlg32.ocx |
COMDLG32 OLE Control DLL |
一個ActiveX控制模塊,用于通用對話框控制 |
OLE |
否 |
是 |
0 |
12 |
hhctrl.ocx |
Microsoft HTML Help Control |
Microsoft幫助文檔界面相關(guān)文件 |
Microsoft HTML Help Control |
否 |
是 |
0 |
13 |
mscomct2.ocx |
Microsoft Common Controls 2 ActiveX Control DLL |
ActiveX插件公用管理模塊 |
Windows ActiveX |
是 |
是 |
0 |
14 |
msdxm.ocx |
Windows Media Player 2 ActiveX Control |
Windows Media Player播放器ActiveX控制相關(guān)文件 |
Windows Media Player |
否 |
是 |
0 |
15 |
msscript.ocx |
Microsoft Script Control |
Visual Basic 6.0應(yīng)用程序腳本控制的一部分,用于運行時庫 |
Visual Basic |
否 |
是 |
0 |
16 |
mswinsck.ocx |
Microsoft Winsock Control DLL |
Visual Basic語言的socket編程相關(guān)文件 |
Visual Basic |
否 |
是 |
0 |
17 |
sysmon.ocx |
Microsoft System Monitor Control |
系統(tǒng)性能監(jiān)視的ActiveX控件 |
Microsoft Windows |
是 |
是 |
0 |
18 |
tabctl32.ocx |
TABCTL32 OLE Control DLL |
一個ActiveX控制模塊,用于SSTab控制和Tabbed對話框控制 |
OLE |
否 |
是 |
0 |
19 |
tdc.ocx |
TDC ActiveX Control |
Visual Basic應(yīng)用程序相關(guān)表列數(shù)據(jù)ActiveX控件模塊 |
Visual Basic |
否 |
是 |
0 |
20 |
wshom.ocx |
Windows Script Host Runtime Library |
Windows本地腳本對象運行時相關(guān)文件 |
Windows Script Host |
是 |
是 |
0 |