【NSIS使用经验】打包含有oracle客户端的应用程序

有关如何抽取oracle客户端,请参见《制作安装包之抽取oracle客户端的一种方法》。

抽取文件后,在安装的时候还需要修改相应的注册表,环境变量,NSIS脚本代码大致如下(oracle10g,支持oracle oledb):

—————————————————————————————————-

;在注册表中写入oracle信息 WriteRegStr   HKLM “SOFTWARE\ORACLE” “inst_loc” “C:\Program Files\Oracle\Inventory” WriteRegStr   HKLM “SOFTWARE\ORACLE\KEY_OraClient10g_home1″ “ORACLE_HOME” “$INSTDIR\Oracle” WriteRegStr   HKLM “SOFTWARE\ORACLE\KEY_OraClient10g_home1″ “ORACLE_HOME_NAME” “OraClient10g_home1″ WriteRegStr   HKLM “SOFTWARE\ORACLE\KEY_OraClient10g_home1″ “ORACLE_GROUP_NAME” “Oracle – OraClient10g_home1″ WriteRegStr   HKLM “SOFTWARE\ORACLE\KEY_OraClient10g_home1″ “ORACLE_BUNDLE_NAME” “Enterprise” WriteRegStr   HKLM “SOFTWARE\ORACLE\KEY_OraClient10g_home1″ “NLS_LANG” “SIMPLIFIED CHINESE_CHINA.ZHS16GBK” WriteRegStr   HKLM “SOFTWARE\ORACLE\KEY_OraClient10g_home1″ “OLEDB” “$INSTDIR\Oracle\oledb\mesg” WriteRegStr   HKLM “SOFTWARE\ORACLE\KEY_OraClient10g_home1″ “StmtCacheSize” “0″ WriteRegStr   HKLM “SOFTWARE\ORACLE\KEY_OraClient10g_home1\OLEDB” “CacheType” “Memory” [...]

【NSIS使用经验】修改和删除环境变量

;设置oracle的环境变量到PATH路径 ReadRegStr $0 HKLM “SYSTEM\CurrentControlSet\Control\Session Manager\Environment” “Path” WriteRegExpandStr HKLM “SYSTEM\CurrentControlSet\Control\Session Manager\Environment” “Path” “$0;$INSTDIR\Oracle\bin\” ;刷新环境变量 SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 “STR:Environment”

;利用WordReplace函数从PATH中删除设置oracle的环境变量 ;需要在文件头引入相应的头文件:!include “WordFunc.nsh” ReadRegStr $R0 HKLM “SYSTEM\CurrentControlSet\Control\Session Manager\Environment” “Path” ${WordReplace} $R0 “;$INSTDIR\Oracle\bin\” “” “+” $R1 ;MessageBox MB_OK|MB_USERICON ‘$R0 – $INSTDIR – $R1 ‘ WriteRegExpandStr HKLM “SYSTEM\CurrentControlSet\Control\Session Manager\Environment” “Path” “$R1″

【NSIS使用经验】禁止多个安装程序实例或禁止重复安装程序

;在安装程序运行前的回调函数前实现 Function .onInit ;禁止多个安装程序实例 System::Call ‘kernel32::CreateMutexA(i 0, i 0, t “JWBClient”) i .r1 ?e’ Pop $R0 StrCmp $R0 0 +3 MessageBox MB_OK|MB_ICONEXCLAMATION “安装程序已经在运行。” Abort

;禁止重复安装程序 ReadRegStr $0 HKLM ‘${PRODUCT_DIR_REGKEY}’ “” StrLen $1 $0 IntCmp $1 0 +3 +1 +1 MessageBox MB_OK|MB_USERICON ‘$(^Name) 已安装在计算机中。如需重新安装,请卸载已有的安装’ Quit FunctionEnd

制作安装包之抽取oracle客户端的一种方法

从oracle 10g开始,oracle官方提供了一个精简的client,叫oracle instant client,只有几十M,免安装,可供分发。其下载地址:

http://www.oracle.com/technology/software/tech/oci/instantclient/index.html

至 于如何配置、使用等,本文不予介绍。如果能够使用此client打包程序成功的,也可以不必看此文。网上有网友说,这个client比起普通的 client,还存在很多bug,但我没有证实过。我之所以需要手工抽取,是因为,它不包括oracle oledb,而我的程序需要它。

下面介绍我此次抽取客户端的经历,以及从中总结出的一种通用的抽取方法。

首先,参照了三篇网文《Oracle10g Client的手工分发》(http://www.cnblogs.com/pilybird/archive/2006/10/24/538338.html),《Oracle OLEDB 的手工分发》(http://www.cnblogs.com/pilybird/archive/2006/10/26/540943.html),《Oracle学习笔记:手工注册oracle的oledb驱动》(http://www.cnblogs.com/jinzhenshui/archive/2009/01/08/1371634.html),我抽取了必须的文件,具体的抽取过程,可以参照下列dos脚本(需要修改定义的变量):

——————————————————————–

@ECHO    从Oracle 10g Client中提取精简客户端

REM 定义变量 set ORACLE_CLIENT_HOME=E:\client_1 set DEST_ORA_CLIENT_DIR=E:\ora10g_client

REM sqlplus目录 mkdir %DEST_ORA_CLIENT_DIR%\sqlplus mkdir %DEST_ORA_CLIENT_DIR%\sqlplus\mesg copy %ORACLE_CLIENT_HOME%\sqlplus\mesg\*.* %DEST_ORA_CLIENT_DIR%\sqlplus\mesg

REM oracore目录 mkdir %DEST_ORA_CLIENT_DIR%\oracore mkdir %DEST_ORA_CLIENT_DIR%\oracore\zoneinfo copy %ORACLE_CLIENT_HOME%\oracore\zoneinfo\*.* %DEST_ORA_CLIENT_DIR%\oracore\zoneinfo mkdir %DEST_ORA_CLIENT_DIR%\oracore\mesg copy %ORACLE_CLIENT_HOME%\oracore\mesg\*.* %DEST_ORA_CLIENT_DIR%\oracore\mesg

REM Network目录 mkdir %DEST_ORA_CLIENT_DIR%\Network mkdir %DEST_ORA_CLIENT_DIR%\Network\Admin [...]