制作installshield安装文件的技巧

制作installshield安装文件的技巧

最近又一个项目接近尾声,不过对方要求安装必须傻瓜化,尽量不用手动配置。于是就的重新捡起两三年没有用过的installshield了。找到 installshield 12 于是,着手开始制作安装包。因为是网站项目,所以,其他方面倒是问题不大,因为当年用installshield 6.2的时候,也是相当熟练的。最主要的有两个方面:一、数据库的安装,因为我的数据库里面有许多存储过程和初始数据,所以不想直接用script来初始化。于是就想直接在安装包中把数据库文件和日志文件打包,然后在安装时直接附加就行。二、修改web.config文件中的数据库连接字符串和一些相关的参数,比如一些路径相关的参数等等。



其中第一点经过摸索和总结,有两种方法:1、直接使用自定义的函数,声称sql语句,然后调用osql.exe来执行。

函数如下:

制作installshield安装文件的技巧functionnumberCreateDataBase(svSQLsvr,svSQLusr,svSQLpwd)
制作installshield安装文件的技巧
STRINGszCmdLine,szWaitTxt;
制作installshield安装文件的技巧begin
制作installshield安装文件的技巧szWaitTxt
="正在创建所需数据库制作installshield安装文件的技巧.";
制作installshield安装文件的技巧SdShowMsg(szWaitTxt,
TRUE);
制作installshield安装文件的技巧Delay(
2);
制作installshield安装文件的技巧
制作installshield安装文件的技巧
if(g_bWinLogin)then
制作installshield安装文件的技巧szCmdLine="/E/S"+svSQLsvr+"/Q/"EXECsp_attach_db@dbname=N'dlbj',@filename1=N'"+TARGETDIR^"mydb.MDF',@filename2=N'"+TARGETDIR^"dlbj_web_log.LDF'/"";
制作installshield安装文件的技巧else
制作installshield安装文件的技巧szCmdLine="/U"+svSQLusr+"/P"+svSQLpwd+"/S"+svSQLsvr+"/Q/"EXECsp_attach_db@dbname=N'dlbj',@filename1=N'"+TARGETDIR^"dlbj_web.MDF',@filename2=N'"+TARGETDIR^"mydb_log.LDF'/"";
制作installshield安装文件的技巧endif;
制作installshield安装文件的技巧
//szCmdLine="/U"+svSQLusr+"/P"+svSQLpwd+"/S"+svSQLsvr+"/Q/"EXECsp_attach_db@dbname=N'dlbj',@filename1=N'"+TARGETDIR^"dlbj_web.MDF',@filename2=N'"+TARGETDIR^"dlbmydb_log.LDF'/"";
制作installshield安装文件的技巧
制作installshield安装文件的技巧if(LaunchAppAndWait("osql.exe",szCmdLine,WAIT)<0)then
制作installshield安装文件的技巧MessageBox("数据库创建失败!请确您的系统中已安装MicrosoftSQLServer2000.如仍无法解决,请联系系统供应商!",SEVERE);
制作installshield安装文件的技巧endif;
制作installshield安装文件的技巧SdShowMsg(szWaitTxt,
FALSE);
制作installshield安装文件的技巧szWaitTxt
="正在优化系统数据库制作installshield安装文件的技巧.";
制作installshield安装文件的技巧SdShowMsg(szWaitTxt,
TRUE);
制作installshield安装文件的技巧Delay(
2);
制作installshield安装文件的技巧szCmdLine
="/U"+svSQLusr+"/P"+svSQLpwd+"/S"+svSQLsvr+"/Q/"usedlbj;execsp_updatestats/"";
制作installshield安装文件的技巧
if(LaunchAppAndWait("osql.exe",szCmdLine,WAIT)<0)then
制作installshield安装文件的技巧MessageBox("数据库优化失败!您可以在sql查询分析器中执行usedlbj;execsp_updatestats完成!",SEVERE);
制作installshield安装文件的技巧endif;
制作installshield安装文件的技巧SdShowMsg(szWaitTxt,
FALSE);
制作installshield安装文件的技巧
制作installshield安装文件的技巧return
0;
制作installshield安装文件的技巧
制作installshield安装文件的技巧
end;

然后在OnEnd中执行如下代码:

制作installshield安装文件的技巧if!MAINTENANCEthen
制作installshield安装文件的技巧
制作installshield安装文件的技巧CreateDataBase(g_szServer,g_szUser,g_szPassword);
制作installshield安装文件的技巧endif;

其中,g_szServer,g_szUser,g_szPassword分别为,在installshield中数据库设置界面(或者自定义窗口)中操作得到的服务器地址,用户名和密码。

2、直接在 安装设计视图中创建连接后,直接创建一个sqlscript,会在安装的时候直接执行。这样的话就的提前知道安装的位置(这是不可能的),于是就直接写成可替换的字符串,然后使用 text replacement 选项卡,设置替换项。其中,sqlscript如下:

制作installshield安装文件的技巧USEmaster;
制作installshield安装文件的技巧
GO
制作installshield安装文件的技巧--Dropdatabaseifitexists.
制作installshield安装文件的技巧IFEXISTS(SELECTnameFROMsys.databasesWHERENAME='dmydb')
制作installshield安装文件的技巧
DROPDATABASEdmydb;
制作installshield安装文件的技巧
GO
制作installshield安装文件的技巧CREATEDATABASEdlbjONPRIMARY
制作installshield安装文件的技巧(FILENAME=
制作installshield安装文件的技巧'%TEXT_TO_BE_REPLACED_IN_THE_FILE%/dmydb.mdf')
制作installshield安装文件的技巧
LOGON(FILENAME=
制作installshield安装文件的技巧'%TEXT_TO_BE_REPLACED_IN_THE_FILE%/dmydb_log.LDF')
制作installshield安装文件的技巧
FORATTACH;
制作installshield安装文件的技巧
GO

其中:%TEXT_TO_BE_REPLACED_IN_THE_FILE%是要替换为安装目录的字符串。

这里有个值得注意的地方,如果是installscript项目。那么,在text replacement 选项卡,替换后的内容不能直接设置为[INSTALLDIR]或者 [TARGETDIR],而是要同样设置为一个替换变量,如:<USER_DATA>,即就是,把:%TEXT_TO_BE_REPLACED_IN_THE_FILE%替换为:<USER_DATA>,然后在 installscript的 Dlg_SdAskDestPath2: 代码段中,执行如下语句即可。

TextSubSetValue ("<USER_DATA>", TARGETDIR , TRUE );

当时这里困扰我很长世界,最后还是上国外的网站上找到了解决方案。


对于第二点,则,直接使用函数:

 

制作installshield安装文件的技巧functionUpdateKey(svFilePath,svFindEntry,svNewEntry)
制作installshield安装文件的技巧NUMBERnResult,nvLineNumber;
制作installshield安装文件的技巧
STRINGWebConfigFile,svReturnLine;
制作installshield安装文件的技巧
制作installshield安装文件的技巧begin
制作installshield安装文件的技巧
//buildthepathtotheWeb.Config
制作installshield安装文件的技巧WebConfigFile
=svFilePath^"web.config";
制作installshield安装文件的技巧
制作installshield安装文件的技巧
//searchthefileforthekeywespecify
制作installshield安装文件的技巧nResult
=FileGrep(WebConfigFile,svFindEntry,svReturnLine,nvLineNumber,RESTART);
制作installshield安装文件的技巧switch(nResult)
制作installshield安装文件的技巧
case0:
制作installshield安装文件的技巧
//Sincethislinenormallyappearstwiceinourweb.configfile,we're
制作installshield安装文件的技巧//checkingfortheexistenceofa2ndmatchandupdatingitinstead.
制作installshield安装文件的技巧
//Ifthereisno2ndmatch,goaheadandupdatetheonewefind.
制作installshield安装文件的技巧
if(svFindEntry="connectionString")then
制作installshield安装文件的技巧nResult=FileGrep(WebConfigFile,svFindEntry,svReturnLine,nvLineNumber,CONTINUE);
制作installshield安装文件的技巧
if(nResult<0)then
制作installshield安装文件的技巧FileGrep(WebConfigFile,svFindEntry,svReturnLine,nvLineNumber,RESTART);
制作installshield安装文件的技巧endif;
制作installshield安装文件的技巧endif;
制作installshield安装文件的技巧
制作installshield安装文件的技巧
//oncewefindthekey,update(replace)itwithournewvalues
制作installshield安装文件的技巧
if(FileInsertLine(WebConfigFile,svNewEntry,nvLineNumber,REPLACE)<0)then
制作installshield安装文件的技巧//hmmm制作installshield安装文件的技巧wecouldn'tupdatethevalueofthekey
制作installshield安装文件的技巧MessageBox("UnabletoupdateWeb.Configfile.",SEVERE);
制作installshield安装文件的技巧endif;
制作installshield安装文件的技巧
case-2:
制作installshield安装文件的技巧
//FileNotFound
制作installshield安装文件的技巧MessageBox(
"Web.Configfilenotfound.",SEVERE);
制作installshield安装文件的技巧
case-4:
制作installshield安装文件的技巧
//EOFreached
制作installshield安装文件的技巧MessageBox(svFindEntry
+"keynotfound.",SEVERE);
制作installshield安装文件的技巧default:
制作installshield安装文件的技巧
//unknownerror
制作installshield安装文件的技巧MessageBox("Anunknownerrorhasoccurred.TheWeb.ConfigfilehasNOTbeenupdated.",SEVERE);
制作installshield安装文件的技巧endswitch;
制作installshield安装文件的技巧
end;

即可。