八、許可協議
開啟【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的方式去實現了,不得不承認研究這個真的很頭疼,需要深入研究的同仁,可以多學習。