大家都知道java生成的exe如果没有jre是无法运行的,如果客户自己安装setup.exe以后自己配置java环境,那客户一定会骂你这个软件怎么这么差,呵呵。所以我今天要说的使用InstallShield打包将java
exe
jdk(或jre)一起打包安装,安装完成自动执行EXE.至于如何打包exe请参考我前面写的:http://suiyuan0808.iteye.com/blog/852231.我把我之前做的打包代码拷贝出来供大家参考。这段代码需要写到InstallShield工程的Setup.Rul里面去。下面语言有点像vb语言
#include "ifx.h"
//开始安装时候会自动检查jdk环境并安装
function OnBegin()
begin
Disable (BACKBUTTON);
if(!MAINTENANCE)then
SdLicense2 ("License ", "", "", SUPPORTDIR ^ "sn.txt",
FALSE);
endif ;
//如果大家的jdk和我的不一样请修改红色粗体部分即可。
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
//这里意思在注册表里面没有找到jdk注册信息,则安装jdk
if (RegDBKeyExist ("SOFTWARE\\JavaSoft\\Java Development
Kit\\1.6.0_04") <
0) then
if(LaunchAppAndWait (SUPPORTDIR^"jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe","",
LAAW_OPTION_WAIT)<0)then
MessageBox ("您的系统没有安装 JDK
1.6.0_04 t! ", INFORMATION);
endif;
endif;
end;
//安装结束之前,设置java_home环境变量
function OnEnd()
STRING szFeatureName;
STRING serviceTarget;
STRING szDocFile;
STRING szKey;
NUMBER nvType;
STRING svValue;
NUMBER nvSize;
begin
//检查是否已经安装jdk
szKey = "SOFTWARE\\JavaSoft\\Java Development
Kit\\1.6.0_10";
RegDBSetDefaultRoot(HKEY_LOCAL_MACHINE);
//如果已经安装则设置环境变量
java_home
if (RegDBKeyExist(szKey)=1) then//如果该注册表值存在
if(RegDBGetKeyValueEx(szKey,"JavaHome",nvType,svValue,nvSize)=0)
then
szKey = "SYSTEM\\CurrentControlSet\\Control\\Session
Manager\\Environment";
if(RegDBSetKeyValueEx(szKey, "JAVA_HOME", REGDB_STRING, svValue,
-1)<0) then
MessageBox ("Javahome create failed, please set it manually!",
SEVERE);
endif;
endif;
endif;
//最后启动您的exe文件
szFeatureName="main";
serviceTarget=TARGETDIR^"wangdianzhushou.exe";
if (FeatureIsItemSelected(MEDIA, szFeatureName)=1) then
if(FindFile(TARGETDIR, " wangdianzhushou.exe
", szDocFile)=0) then
if (LaunchApp (serviceTarget, "") < 0) then
MessageBox ("无法启动程序 "+serviceTarget+".", SEVERE);
endif;
endif;
endif;
end;
结合我们自己产品的脚本:
function OnEnd()
STRING
szTitle, szMsg1, szMsg2;
STRING serviceTarget, msvcr100Target,
msvcp100Target;
STRING exePATH,SystemFolder;
BOOL vcredistIsResult, msvcr100IsResult,
msvcp100IsResult;
NUMBER
nDefOption, nReserved,nOption;
//below is for environemnt //zz
NUMBER
nResult; //zz
STRING
szKey, szEnv, szTargetPath; //zz
POINTER
pEnv; //zz
// above is for environemnt //zz
begin
exePATH=TARGETDIR+"\\"+"MQA_2012_07";
serviceTarget
=exePATH^"vcredist_x86.exe";
msvcr100Target=SystemFolder^"msvcr100.dll";
msvcp100Target=SystemFolder^"msvcp100.dll";
//SystemFolder=C:\Windows\System32\
vcredistIsResult = Is(
FILE_EXISTS, serviceTarget ); // zz:
判断vcredist_x86是否存在
msvcr100IsResult = Is(
FILE_EXISTS, msvcr100Target );
msvcp100IsResult = Is(
FILE_EXISTS, msvcp100Target );
if(vcredistIsResult=TRUE
) then //zz vcredist_x86存在则执行下面内容
if(msvcr100IsResult=FALSE)
then
//if
(LaunchApplication (serviceTarget, "",
"",SW_NORMAL,200,LAAW_OPTION_WAIT) < 0) then
if (LaunchApp
(serviceTarget, "/p") < 0) then
MessageBox
("install vcredist_x86 failed", SEVERE);
endif;
elseif(msvcp100IsResult=FALSE)
then
//if
(LaunchApplication (serviceTarget, "",
"",SW_NORMAL,200,LAAW_OPTION_WAIT) < 0) then
if (LaunchApp
(serviceTarget, "/p") < 0) then
MessageBox
("install vcredist_x86 failed", SEVERE);
endif;
endif;
endif;