InstallShield詳細製作說明(三)__installsheild

來源:互聯網
上載者:User

八、許可協議

開啟【Installation Designer】->【Behavior and Logic】->【Support Files/Billboards】面板

這裡【Language Independent】是指的設定將在任何語言下都會起作用相當於預設,下面還有【中文(簡體)】,就相當於分支,只有中文下起作用。這裡我們就只做通用的,在【Language Independent】,添加“軟體許可協議.txt”檔案。

然後,再點擊【Disk1】,這裡我們存放一些運行系統所需的先決條件,這些檔案是不會打包到setup.exe裡面,而是跟setup.exe平級的,因為這些條件不是每台機器都需要的,也不屬於產品內的東西。

九、安裝指令碼

這部分是最複雜,也是最重要的。開啟【Installation Designer】->【Behavior and Logic】->【InstallScript】面板

指令碼事件主要有三大類:Before Move Data(安裝資料前)、Move Data(安裝資料過程中)、After Move Data(安裝資料後)。

OnBegin:在初始化後,被調用

OnFirstUIBefore:第一次安裝時,在複製安裝資料之前觸發的事件,更改這個事件的指令碼可自訂安裝步驟(一般我們都是修改這個)

OnMainUIBefore:在修改或卸載時,在複製安裝資料之前觸發的事件,例如安裝程式在安裝時添加了服務,在卸載時安裝程式不會將此服務反安裝,這就需要指令碼刪除服務。

OnSQLLogin:Ms SQL SERVER資料庫安裝登入函數。

MoveData:一般很少有人會去改

OnFirstUIAfter: 第一次安裝時,在複製安裝資料之後觸發的事件,例如有些地方需要設定路徑,在安裝前路徑不存在,必須安裝後才能設定。

OnMainUIAfter: 在修改或卸載時,在修改或卸載資料之後觸發的事件

OnEnd:在安裝完成之後觸發的事件,即點擊【完成】按鈕後觸發的事件。

 

我們先寫許可協議介面,可以看到現在指令碼是空的。在右側,將下拉式清單選為【BeforeMoveData】【OnBegin】。這裡注意不要看當前是OnBegin,就不選了,一定要選一下,才會觸發代碼產生。begin與end之間的內容就是我們要具體要執行的動作了。

function OnBegin()

begin

         //禁用上一步

Disable(BACKBUTTON);

         //判斷安裝程式處於何種狀態,安裝、修複、重新安裝或卸載狀態,後三者屬於MAINTENANCE狀態,因此判斷只有在正常安裝的狀態下才顯示許可協議

if(!MAINTENANCE)then

         //TRUE表示預設選中接受協議

SdLicense2("軟體許可協議","","",SUPPORTDIR^"軟體許可協議.txt",TRUE);

         endif;

end;    

SdLicense2(szTitle,szOpt1,szOpt2,szLicenseFile,bLicenseAccepted);

參數szTitle: 介面左上方的標題,填””則預設為”License Agreement”

參 數szOpt1、szOpt2:兩個選項“同意”和“不同意”。預設值“I accept the terms of the license agreement”和“I do not accept the terms of the license agreement”

參數 szLicenseFile:指定需要顯示的文檔,包含路徑和帶副檔名的文檔名。“軟體許可協議.txt”上面放在了supportfile下了,這個路 徑在Installshield裡有專門的靜態變數,即SUPPORTDIR,後面再加上檔案名稱,用^來串連,檔案名稱需要加引號

 

這 裡細說一下SdLicense2,這個你可以去【User Interface】->【Dialogs】,下面了一堆的對話方塊,你也可以自訂對話方塊。所以上面SdLicense2直接就是對話方塊的名字,這 種用法就跟構造器一樣,那參數呢,你可以看到對話方塊右側下方,有簡單說明,你點擊那個連結就會開啟API文檔了,那裡會詳細解釋每個欄位的含義。

下面在OnFirstUIBefore中添加先決條件和安裝路徑,點擊下拉式清單產生代碼

如 果上面你已經試過編譯,你會發現安裝的步驟還挺多的,其實每一個步驟都對應著產生的程式碼中的Dlg_XXXXXX,有很多可能你都不需要的,下面是我修改 後的代碼。主要就是檢查是否安裝了NetFramework,MySQL,沒有則安裝,另外就是讓使用者指定要安裝的Feature。Dlg_XXXXXX 是按順序執行的,當然你也可以看到通過goto可以跳轉。

function OnFirstUIBefore()

    NUMBER nResult, nSetupType, nvSize, nUser;

    STRING szTitle, szMsg, szQuestion, svName, svCompany, szFile;

    STRING szLicenseFile;

         BOOL bCustom, bIgnore1, bIgnore2;

         STRING SETUPEXEDIR[MAX_PATH + 1];   //擷取安裝程式Setup.exe自身所在的路徑

    NUMBER nBuffer; // local buffer-size variable                         

    STRING  svMsiexec,svMsiPackage,svParam;

begin       

    if( REMOVEONLY ) then

        Disable( DIALOGCACHE );

                   szMsg = SdLoadString( IDS_IFX_ERROR_PRODUCT_NOT_INSTALLED_UNINST );

               SdSubstituteProductInfo( szMsg );

                   MessageBox( szMsg, SEVERE );

                   abort;

    endif;

   

         nSetupType = TYPICAL;   

 

Dlg_SdWelcome:

    szTitle = "";

    szMsg = "單擊'下一步',將安裝XX產品,如果有先決條件未安裝,將會先安裝先決條件";

   

    nResult = SdWelcome(szTitle, szMsg);

         if (nResult = NEXT) then

             //檢查先決條件   

        //設定預設的註冊表索引值根節點為HKEY_LOCAL_MACHINE

             RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);

             MsiGetProperty(ISMSI_HANDLE, "SETUPEXEDIR", SETUPEXEDIR, nBuffer);

            

             //判斷.netFramework 4.0

             if(RegDBKeyExist("SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full")<0) then

                if(LaunchAppAndWait(SETUPEXEDIR^"dotNetFx40_Full_x86_x64.exe","",LAAW_OPTION_WAIT)<0)then

                   MessageBox("安裝NetFramework4.0失敗",INFORMATION);

                endif;

             else

                //MessageBox("系統已安裝NetFramework4.0",INFORMATION);

             endif;

            

             //判斷MySQL

             if(RegDBKeyExist("SOFTWARE\\MySQL AB")<0) then

                if(LaunchAppAndWait(SETUPEXEDIR^"install_mysql.bat","",LAAW_OPTION_WAIT)<0)then

                   MessageBox("安裝MySQL失敗",INFORMATION);

                endif;

             else    

               // MessageBox("系統已安裝MySQL",INFORMATION);

             endif;

       

            goto Dlg_SdFeatureDialog;

         endif;

        

 Dlg_SdFeatureDialog:

          szTitle = "";

          szMsg = "";

          nResult = SdFeatureDialog(szTitle, szMsg, INSTALLDIR, "");

          if (nResult = BACK) goto Dlg_SdWelcome;   

        

     // Added in IS 2009 - Set appropriate StatusEx static text.

     SetStatusExStaticText( SdLoadString( IDS_IFX_STATUSEX_STATICTEXT_FIRSTUI ) );

 

     // setup default status

     Enable(STATUSEX);

     return 0;        

end;

 

上面調用mysql的時候用的bat間接調用的,msi貌似能直接調用,但是我試了很多,沒有試出來,如果試出來請告知。

這裡我並沒有研究太多的指令碼代碼,只是基本上實現了自己的需求,把一些痛點都用database.exe的方式去實現了,不得不承認研究這個真的很頭疼,需要深入研究的同仁,可以多學習。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.