InstallShield X製作安裝程式

mxdxm8899發表於2010-05-04

 

InstallShield X製作安裝程式雜記(前言)

 

公司要做一個應用軟體產品包裝,產品本身的質量,實在是不好意思說什麼,那就不說了。我的任務就是要把這個產品包裝得大氣一點。軟體的安裝程式製作,有很多工具可以使用,但頭兒指定了InstallShield X,那我們就硬著頭皮上吧!(以下簡稱X
   X的安裝,一看就與眾不同,藍色的背景,感覺很新穎。對於這個新版的安裝製作工具,對我還是有很大的吸引力的。而正因為是新版本,其組織結構和以前的版本有很大不同,所以可查的資料很少,無論是英文還是中文。當時只有http://blog.joycode.com/hopeq/archive/2004/08/02/29325.aspx
上有一點比較簡單的介紹,所以主要還得靠自己了,經過大概一週的努力,遇到不少問題,總算是把一個比較常見的完整安裝過程完成了。寫下這些東西的目的,不光是給自己記錄,還可以給像我當時那樣的新手以一定的參考。文章組織也許不是很有邏輯性,所以叫雜記,只要能給別人有一點用處,不至於誤導,我心足矣。如果有不正確的地方,還請大家指出。
說明:本人的安裝工程是ScriptInstallProject,所以文中的檢視、功能項均以ScriptInstallProject為準。

 

InstallShield X製作安裝程式雜記(1.檢視概貌)

        把檢視篇寫在首位,主要是我當時在看幫助的時候,看到很多諸如installscript view,dialog view之類的字眼,可我在皮膚上不能很快的找到,好像這幫助寫的不是這個版本似的,這讓我感覺很鬱悶。而後來發現,這還是和不熟悉有很大關係。廢話少說,我們們先來看看檢視。
       
開啟選單View,第三個選單項為View Bar,點選之後,在視窗左邊會出現一個檢視列表條,分Installshield,View list stepsWorkspace三欄,Installshield欄中主要是一些簡介、幫助資訊,不必多看。View list steps裡面即是installation Designer中的一級檢視導航。Workspace欄,這正是關鍵所在。我所疑惑的幫助中所說的view,指的就是這裡,這裡列出了常用的二級檢視。請記住:View Bar

      
另外一個重要的檢視是Project Assistant(工程助理檢視),在Workspace欄中有入口,但是可能出現你點選了那個按鈕,卻沒有任何反應的情況,是為什麼呢,原來問題還在View選單,看最後一個選單項Project Assistant,把它選中就可以了。

      
主工作區,有幾個切換頁(Start page/Project Assistant/Installation DesignerStart Page是可以不用看,其中Installation Designer是最主要的工作檢視。
      
本篇主要給新手剛進入系統進行環境熟悉,具體檢視的內容,將在後面的文章進行介紹。

 

InstallShield X製作安裝程式雜記(2.Installation Information節點)

 Installation Information,即安裝資訊。
(一).General Information:
 1. Project Properties,
     Author Name
中填寫作者姓名;Setup Languages,下面會列出一個語言列表,你可以根據需要進行勾選,InstallShield X預設的語言是English,如果你只要簡體中文的話,需要先選中Chinese(Simplified),然後把在‘String Tables’下把Chinese(Simplified)設定為預設(點選右鍵,Make Default),再把English從列表中去掉。如果選擇了多種語言,安裝時會出現語言選擇對話方塊。

      PlatForms
選擇這個安裝程式可以在哪些作業系統中進行安裝。
2.Add or Remove Programs:
這欄資訊與控制皮膚->新增/刪除程式相關
      Display Icon:
選擇在新增/刪除程式列表中顯示的圖示
      Disable Change Button 
是否讓新增/刪除程式列表中的更改按鈕是否無效,預設為NO,即不Disable,有效。
      Disable Remove Button
是否讓新增/刪除程式列表中的刪除按鈕是否無效,預設為NO,即不Disable,有效。
      Publisher/Product URL
發行商/產品 網址
      Read Me
可以填寫readme檔名。
     
。。。接下來的幾個都是類似的資訊,不再一一列出,這些資訊,將在新增/刪除程式列表中點選支援資訊彈出的對話方塊中出現。
3.Product Properties
產品屬性
  
這個很簡單,挑幾個重要的說說:
  TARGETDIR 
目標資料夾。比如
<FOLDER_APPLICATIONS>\<IFX_COMPANY_NAME>\<IFX_PRODUCT_NAME>   
這幾個括號中的是變數。分別代表應用 程式資料夾\公司名稱\產品名稱,你也可以修改這個值,如去掉公司名稱變數。
 Executable File
主程式名稱 
Application Type
應用程式型別 我選的是Standard Windows Application 。這個值有對安裝有什麼影響,還沒有試驗。

4.String Tables
字串表。
 
點選下面的Chinese(Simplified)節點,可以看到字元定義表,這些變數,可能影響你安裝的顯示。你可以進行相應的修改、新增。
  
(二)Update Service更新服務   如果選了Enable Update ServiceTrue,可以設定Host(主機)/Update Check Interval(更新檢查間隔時間)等來配置更新服務。這個功能,由於我還沒有加以試驗。先不多說,以後再補充。

 

InstallShield X製作安裝程式雜記(3.Orgnization節點)

()Setup Design 安裝設計,這個節點實際是FeaturesComponents的一個樹結構
(
)Features   這個節點很重要。不知怎麼翻譯比較好,暫且叫安裝部分比如你的軟體有幾個部分,可以由使用者選擇安裝,就需要在這裡分別設定。各個Features之間可以有依賴關係,一個Features可以包括多個Components。(通過new Component就可以建立。) 從使用者角度來看,這是產品的最小組成部分。
(
)Components 安裝零件。可以是檔案、快捷方式、登錄檔項等。多個Components組成一個Feature,從製作者角度來看,是安裝程式的最小組成部分。
(
)Setup Types 安裝型別。可以在這裡維護安裝型別,比如新增一個完整安裝自定義安裝最小安裝等。這個節點很簡單,點選每個安裝型別,可以選擇相應的Feature,右邊可以設定顯示和描述的文字。

 

InstallShield X製作安裝程式雜記(4.Application Data節點)

1.Files and Folders(檔案與資料夾):這個一看就明白,有四個區域Source computer's folders(源機器資料夾,即製作安裝程式的機器中的資料夾),Source Computer's files(原始檔,列出原始檔夾中的檔案)
Destination computer's folders
(目標機器資料夾,即要安裝的機器上的資料夾),Destination computer's files(目標檔案)。
     
1 前兩個,跟資源管理器沒多大區別,重點說說Destination computer's folder,這裡一般會列出[AppDataFolder],[Common FilesFolder],[INSTALLDIR],如果需要其他資料夾,可以通過在根節點Destination Computer上點選右鍵->Show Predifined Folder來選擇,這樣就可以把檔案安裝到相應的系統預定義資料夾中。
     
2 對於一般的安裝製作,用最後一個就可以。方法:在Source computer's folders中選定原始檔夾,按緊滑鼠,拖拽到[INSTALLDIR]節點下面,拖拽過來時,會彈出一個對話方塊,詢問你是否要使用動態檔案連結,我建議採用動態檔案連結,這樣,如果原始檔發生了變化,都可以在編譯時自動更新。接下來還會出現一個對話方塊,可以設定是否包含子目錄(Include subfolders),是否自動註冊所有的檔案(Self-Register all files)等,一般說來,按Y,然後按一個OK就可以了。
      
3 如果要指定目的資料夾的讀寫許可權,通過右鍵->Properties->Permissions來進行設定。
     
4)一旦加入了資料夾,InstallshieldX就自動建立了一個Component,上一篇中已經說明了ComponentFeature的關係。所以這裡,特別要注意的是,要看清楚最上面的那一行字“Add new components to the feature”後面的下拉框,(2)中的檔案,將和指定的Feature相關聯,如果這裡指定得不對,假如使用者沒有選定這個Feature,那這些檔案就不會安裝到指定的目錄。
2.Redistributables
直譯是重新分配表,我理解的就是安裝所需要的一些附帶包,可以翻譯為分發包點選就可以看到一個列表,把需要的包打勾就可以。

 

InstallShield X製作安裝程式雜記(5.System Configuration節點)

1.Shortcuts(快捷方式)快捷方式主要是以下幾個地方:
Start Menu(
開始選單)/Programs Menu(程式選單)/Startup(啟動)/Desktop(桌面)
   
1Start Menu,如果你裝了UtraEdit就知道了,點選開始選單,在上方就可以看到,這是比較cool的一種方式,堪稱最快捷。而且很多軟體都不往那裡裝,比較顯眼,好找。
   
2Programs Menu,是大多數軟體都採用的快捷方式位置,即在開始->程式中所列出。
   
3Startup,如果你的軟體希望使用者開機就執行,可以在這裡建立,位於開始->程式->啟動。
   
4Desktop,在桌面建立快捷方式。
   
幾種快捷方式的配置方式都一樣,在相應節點上點選右鍵,有一個New Shortcut(但我這裡不知道什麼原因該項無效),我使用的是New Advertised Shortcut,建立以後,右邊會出現一個Key-Value表項,這裡挑幾個說說。
        Display Name
:快捷方式的名稱。
        Target
:這裡寫快捷方式指向的檔名,對應快捷方式中的目標。比如<TARGETDIR>\bin\pmain.exe
        Arguments
:引數。比如主程式的執行引數是pmain  -start,那這裡就填寫-start

        Working Directory
:對應快捷方式中的起始位置比較重要,如果不設定,而程式中使用GetCurrentPath可能獲得的是快捷方式所在的位置(如桌面,而不是目標所在目錄),從而導致程式路徑錯誤。對應上面的Target,這裡應該填寫    <TARGETDIR>\bin
       
2.Registry(登錄檔):可以把一些資訊寫入登錄檔。這個節點的工作區佈局,和上篇所說的Files and Folders很相似,上面是源(Recource),下面是目的(Destination),如果要複製登錄檔項名稱,用法很簡單,在Source computer's Registery view中選定要修改的登錄檔項,按緊滑鼠,拖拽到Destination computer's Registry中的相應節點中就可以;如果要新建表項,在Destination computer's Registry節點中點選右鍵,new->Key,如果要指定key值,使用相應的選單項,跟在登錄檔中直接操作差不多,這裡就不多說了。
----以下幾個節點在MSI Project中有,InstallScript Project中卻沒有。關於××× Project,我一直很困惑,我到時專門寫一個文章,提出我的困惑。
3.ODBC ResourcesODBC 源)
4.INI File Changesini檔案更改)
5.Environment Variables(環境變數)
這幾個節點的配置很簡單,我就不說了。

 

InstallShield X製作安裝程式雜記(6.Server Configuration節點)

1.Internet Information ServicesIIS配置):主要是給Web專案製作使用的。
        
這裡有一個根IIS Configuration,右鍵->Add web side(建立web站點),建立站點時候,可以在站點上面建立虛擬目錄(New Virtual Directory)。右邊的Key-Value表中有很多條目,只要你會設定IIS,這些都是小菜了。
2.SQL ServersMS SQL Server配置):用於SQL Server的配置,我看了一下,好像可以通過SQL指令碼(script)在安裝時建庫,建表等。一言以蔽之,可以作為資料庫的初始化。
在根節點SQL Servers上,右鍵->new SQL Connection,填寫相應資料即可。

--這個大節點,我沒有實際測試,不過比較簡單,屬於一看就明白的,就不一一翻譯了,有問題單獨交流。

 

InstallShield X製作安裝程式雜記(7.Behavior and Logic節點)

1.InstallScript(安裝指令碼):安裝檔案是InstallScript Project的重頭戲,可以通過編寫安裝指令碼檔案,來對安裝程式進行深層次的處理。其中提供了一些標準函式、事件,也可以自定義函式,程式碼風格有點類似C
如何使用指令碼來滋潤安裝程式,後文將用專門篇幅例項說明。
2.Support Files/Billboards(支援檔案,後面的不知道咋翻譯好):一些安裝過程中需要讀寫的檔案,可以新增到這裡。後文例項中將有說明。

 

InstallshieldX安裝製作雜記(例項之安裝完成)

我們可以看到,很多軟體在安裝完成之後,可以有一些選項,比如檢視ReadMe”執行程式等等,這是怎麼做到的呢?
關鍵詞:OnMovedSdFinish
     1.InstallShieldX
指令碼中有一個OnMoved事件。這個事件在需要安裝的檔案拷貝完成之後觸發;

     2.SdFinish
是一個標準對話方塊函式,函式原型為SdFinish ( szTitle, szMsg1, szMsg2, szOpt1, szOpt2, bvOpt1, bvOpt2 );從引數中可以發現,這裡只提供最多兩個選項。

例項程式碼如下:
function OnMoved()
    STRING szTitle;
    STRING   szMsg1, szMsg2,szOpt1,szOpt2;
    BOOL     bvOpt1, bvOpt2;
    STRING szApplicationPath,szApplicationCmdLine,szCmdLine;
begin     
    if (MAINTENANCE) then return 0;endif;//
如果不是安裝狀態,比如修改/解除安裝狀態的時候,則不執行。
    szTitle = "安裝完成";//對話方塊的標題
    szMsg1  = "%P
安裝已經完成.\n" +
              "
請根據需要選擇下面的選項.";//%P為軟體產品名稱

//
如果要單獨在這裡設定產品名稱,在之前使用如下兩句
//    szProductName = "
某某軟體";
//    SdProductName (szProductName);


    szMsg2  = "
點選完成按鈕完成%P安裝.";
    

    szOpt1 = "
閱讀自述檔案";//如果這裡為空,則表示只有一個選項

    szOpt2 = "
執行程式";
    SdFinish (szTitle, szMsg1, szMsg2, szOpt1, szOpt2, bvOpt1, bvOpt2);
    if (bvOpt1) then

        LaunchApp ('notepad.exe',TARGETDIR ^ "\\readme.txt");//LaunchApp 用來執行某外部程式
    endif;
  
    if (bvOpt2) then
           LaunchApp (TARGETDIR ^ "\\App.exe","");
    endif;

end;

InstallshieldX安裝製作雜記(經驗點滴)

1.      安裝型別:
Universal Project
是為了適應不同作業系統而作。
InstallScript Project
最為靈活,Windows Installer頁中的project需要 windows installer server 支援,但有速度快,檔案小的優點。

2.      InstallScript MSI project 可以轉換為InstallScript Project:選單project->Convert to InstallScript Project

3.常用函式:
 NumToStr
StrToNum 整型和字串相互轉換。

InstallshieldX安裝製作雜記(例項之自定義對話方塊)
如何呼叫自定義對話方塊?Installshield幫助中有說明,但有一些環節弄不好就無法實驗成功。比如ControlIDDialogID等。
通過自己的摸索,我完成了自定義對話方塊的建立、事件編寫已經呼叫,現整理出來,希望能給大家提供幫助。
1.
新建對話方塊
(1)
User Interface->dialogs中新建一個Dialog,命名為fbysssDialog;
(2)
通過Control tool bar加入一個Text Area,Text屬性填入"我的自定義對話方塊
";
(3)
加入三個Push Button,分別設定Text屬性為Back,OK,Next,Control Identifier分別設定為14,13,15。其他控制元件可以根據需要新增;

(4)Additional Tools->Direct Editor
找到Dialog,設定fbysssDialogISResourceID10333(如果有重複就改變數字)
2.
編寫對話方塊事件
新建一個指令碼檔案,命名,比如叫"fbysssDialog.rul"
貼上如下程式碼:

#define RES_DIALOG_ID     10333//對話方塊的ID
#define RES_PBUT_NEXT         15   // Next
按鈕的
ID
#define RES_PBUT_OK       13   // OK
按鈕的
ID
#define RES_PBUT_BACK        14   // BACK
按鈕的
ID
#include "Ifx.h"

 export prototype ExFn_DefineDialog(HWND);

function ExFn_DefineDialog(hMSI)
    STRING  szDialogName, szDLLName, szDialog;
    NUMBER  nDialog, nResult, nCmdValue;
    BOOL    bDone;
    HWND    hInstance, hwndParent;          
   // STRING sValue;
begin


    szDialogName = "fbysss
的自定義對話方塊";
    hInstance = 0;//
預設值

    szDLLName = "";    ////
預設值

    szDialog = "";//如果指定了對話方塊的ID,這裡就設定為空字串。
   
    hwndParent = 0;//
保留引數,必須為0
   
    nResult  = DefineDialog (szDialogName, hInstance, szDLLName,
                            RES_DIALOG_ID, szDialog, hwndParent,
                            HWND_INSTALL, DLG_MSG_STANDARD|DLG_CENTERED);
   
    //
錯誤檢查

    if (nResult < 0) then
        MessageBox ("
出錯了.", SEVERE);
        bDone = TRUE;
        abort;
    endif;


   bDone = FALSE;

  //迴圈
  repeat

        //顯示對話方塊,nComValue返回在對話方塊中的事件,如果正常,返回Control ID
        nCmdValue = WaitOnDialog(szDialogName);

        //NumToStr(sValue,nCmdValue);
        //MessageBox(sValue,INFORMATION);
        switch (nCmdValue)
            case DLG_CLOSE:
                //
關閉視窗

                Do (EXIT);
            case DLG_ERR:
                MessageBox ("
無法顯示自定義對話方塊,安裝取消.", SEVERE);
                abort;
            case DLG_INIT: ;
                //
初始化,啥不不幹

            case RES_PBUT_OK:
                // OK
按鈕被按下
                MessageBox("OK
按鈕被按下了。",INFORMATION);
            case RES_PBUT_NEXT:
                MessageBox("Next
按鈕被按下了。
",INFORMATION);
                bDone = TRUE;
            case RES_PBUT_BACK:
                MessageBox("BACK
按鈕被按下了。
",INFORMATION);
                bDone = TRUE;
        endswitch;

    until bDone;

    //關閉對話方塊
    EndDialog (szDialogName);

    //釋放記憶體
    ReleaseDialog (szDialogName);

end;

3.呼叫對話方塊

    Setup.rul頭部加入#include “fbysssDialog.rul“
    ExFn_DefineDialog(0);//
呼叫,這句話根據需要寫在相應的地方。比如一開始就顯示,寫在function OnFirstUIBefore() begin之後。

  
編譯執行,是不是看到效果了?cool

相關文章