[轉]利用InstallShiled 10.5製做AE應用程序安裝包 做者:3SNEWS 社區ESRI(ArcGIS)版版主:zhaoxiang_whu
http://www.3snews.net/bbs/index.phpphp
利用InstallShiled 10.5 打包AE 開發的應用程序
AE 開發的應用程序必需要在裝有AE 運行時而且正確的受權的機器上才能夠運行。所以,在製做安裝包的
時候能夠把AE 運行時一塊兒打進來,用戶在安裝程序時,只須要執行一個安裝文件就能夠正確的運行應用程序
了。利用InstallShiled10.5 打包的基本思路以下:
一、先將本身的程序打包進來;
二、安裝AE 運行時;
三、安裝AE 運行時補丁;
四、檢查系統文件夾下的服務文件是否正確的寫入服務;
五、對AE 運行時進行受權。
有了以上基本思路就能夠開始製做安裝包了。具體步驟以下:
1、
打包本身的程序
一、啓動InstallShiled,建立一個InstallScript Project,以下圖:
二、能夠利用InstallShiled 的工程嚮導,將本身的程序打包進來,效果以下圖:數據庫
其中的Application Target Folder 就是你的應用程序在客戶機器上的那個安裝文件夾。
2、
將全部須要安裝的AE相關的文件準備好,並設置好他們在目標機器上的路徑
一、將全部AE 運行時相關的待安裝文件準備好,放入同一個文件夾內備用。
二、在Application Target Folder 文件夾下新建一個文件夾: 「temp」。此文件夾的做用是用於臨時放置AE
運行時相關的文件,安裝過程完成之後,此文件夾及裏面的全部內容將被刪除。
三、將本機上的準備好的打包文件拖入到temp 文件夾下,以下圖所示:tcp
3、
寫安裝腳本,進行運行時及其補丁的安裝和受權
文件和路徑都已經準備好了之後,就能夠開始寫安裝腳本了。其實在InstallShiled 裏面安裝AE 運行時及
其補丁的原理都至關簡單,就是調用了Windows 的Installer 程序而已。所以,只須要將調用Installer 的參數
設置正確就能夠了。具體參數說明以下:
1 執行安裝時的參數
Msiexec.exe /i "%MSIPATH%" /qn ADDLOCAL= %Feature%
MSIPATH 是Engine 的安裝路徑包括msi 包文件名
Feature 表示安裝時的選項多個feature 用逗號隔開
feature 描述
ArcEngine ArcGIS Engine
JavaRuntime ArcGIS Engine-Java Runtime
DotNetRuntime ArcGIS Engine .NET Runtime
2 安裝後license 的註冊
在安裝路徑下的\Bin\SoftwareAuthorization.exe 是註冊license 的執行文件
有三個經常使用參數
-p <選擇註冊項> IMS SDE ENGINE DEVKIT SERVER
-LIF <選擇註冊文件>
-S 無界面運行
關於更具體的參數說明以及Windows Installer 的運行參數可參考EDN 上面的說明。
在調用Windows 的Installer 時,可使用IS 的內部函數:LaunchAppAndWait,其函數原型爲:
LaunchAppAndWait ( szProgram, szCmdLine, nOptions );
4、
檢查系統文件夾下的服務文件是否正確的寫入了服務
有時候正確的安裝了AE 運行時並對其受權,但在鏈接SDE 數據庫的時候,卻依然會出現問題,這主要是由於
系統文件夾下的Service 文件缺乏SDE 的服務信息。這個文件夾的路徑爲:
<Windows>/system32\drivers\etc\Service.檢查是否有5151/tcp 服務,若沒有,則加上一行:
esri_sde 5151/tcp sde #ArcSDE
5、
生成安裝包
文件路徑設置完成,且代碼也編譯經過之後就能夠經過Installshield 生成安裝文件了。方便起見,能夠將
其生成爲單個EXE 文件。這樣以來,用戶運行該安裝文件後,能夠只須要一直點下一步就能夠完成程序的安裝
和受權了。
6、
腳本程序
如下腳本只實現了基本的功能,各位根據本身的須要進行修改。
#include "ifx.h"
function OnMoved()
string szCommand,szCmdLine,szPath,svResult,LicPath;
STRING svLine,svReturnLine,InsertTxt; //////操做文件的變量
NUMBER nvFileHandle; //////////文件句柄
NUMBER nvLineNumber ,nvResult; //////////操做文件的變量
begin
szPath=TARGETDIR^"temp";
szCommand = WINSYSDIR^"msiexec.exe";
LongPathToShortPath(szCommand);
////////////////////////安裝AE 運行時
if (FindFile (szPath^"ArcEngine92", "Setup.msi", svResult) = 0) then
szCmdLine =TARGETDIR^"temp"^"ArcEngine92"^"Setup.msi\" /qn";
LongPathToShortPath(szCmdLine);
SdShowMsg("正在安裝ArcGIS Engine Runtime,請稍候...",TRUE);
Delay(1);
if (LaunchAppAndWait(szCommand ,"/i \""+szCmdLine,WAIT) < 0) then
MessageBox("安裝ArcGIS Engine Runtime 失敗!",WARNING);
abort;
SdShowMsg("正在安裝ArcGIS Engine Runtime,請稍候...", FALSE);
endif;
SdShowMsg("正在安裝ArcGIS Engine Runtime,請稍候...", FALSE);
endif;
/////////////////////安裝AE 運行時補丁
if (FindFile (szPath, "ArcGISEngine92sp2.msp", svResult) = 0) then
szCmdLine =TARGETDIR^"temp"^"ArcGISEngine92sp2.msp\" /qn";
// SprintfBox(INFORMATION,"TEST","%s",szCmdLine);
LongPathToShortPath(szCmdLine);
SdShowMsg("正在安裝ArcGIS Engine Runtime SP2,請稍候...",TRUE);
Delay(1);
if (LaunchAppAndWait(szCommand ,"/Update \""+szCmdLine,WAIT) < 0) then
MessageBox("安裝ArcGIS Engine Runtime SP2 失敗!",WARNING);
abort;
SdShowMsg("正在安裝ArcGIS Engine Runtime SP2,請稍候...", FALSE);
endif;
SdShowMsg("正在安裝ArcGIS Engine Runtime SP2,請稍候...", FALSE);
endif;
/////////////////////////////安裝AE 中文包
if (FindFile (szPath, "ACEEngine92sp2.exe", svResult) = 0) then
szCmdLine =TARGETDIR^"temp"^"ACEEngine92sp2.exe\" /qn";
LongPathToShortPath(szCmdLine);
SdShowMsg("正在安裝ArcGIS Engine Runtime 中文包,請稍候...",TRUE);
Delay(1);
if (LaunchAppAndWait(szCmdLine ,"",WAIT) < 0) then
MessageBox("",WARNING);
SdShowMsg("正在安裝ArcGIS Engine Runtime 中文包...", FALSE);
endif;
SdShowMsg("正在安裝ArcGIS Engine Runtime 中文包...", FALSE);
endif ;
/////////////////////////AE 受權
SdShowMsg("正在對ArcGIS Engine Runtime 受權,請稍候...",TRUE);
LicPath=" -Lif \"" +TARGETDIR^"temp"^"ArcGIS Engine Runtime License.ECP\" -s";
if (FindFile (TARGETDIR^"temp", "ArcGIS Engine Runtime License.ECP", svResult) = 0) then
szCmdLine="C:\\Program Files\\ArcGIS\\Bin\\SoftwareAuthorization.exe " ;
if (LaunchAppAndWait(szCmdLine ,LicPath,WAIT) < 0) then
MessageBox("受權錯誤!",WARNING);
abort;
endif;
endif;
SdShowMsg(正在對ArcGIS Engine Runtime 受權,請稍候"...",FALSE);
////////////////////////// 寫服務文件
szCmdLine=WINSYSDIR^"drivers"^"etc" ;
InsertTxt="esri_sde 5151/tcp sde #ArcSDE";函數
OpenFileMode (FILE_MODE_APPEND);
if (OpenFile (nvFileHandle, szCmdLine , "services") < 0) then
MessageBox ("不能打開服務文件", SEVERE);
abort;
endif;
nvResult = FileGrep (szCmdLine ^ "services", "esri_sde", svReturnLine,
nvLineNumber, RESTART);
if (svReturnLine!="") then
else
if (WriteLine(nvFileHandle, InsertTxt) < 0) then
MessageBox ("寫入SDE 服務信息失敗", SEVERE);
endif;
endif ;
CloseFile (nvFileHandle);
if (ExistsDir(TARGETDIR^"temp")=0 ) then
if (DeleteProgramFolder (TARGETDIR^"temp") < 0) then
MessageBox ("刪除臨時文件夾失敗,請手動刪除!", SEVERE);
endif;
endif ;
end;.net