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