您好,欢迎访问一九零五行业门户网

installshield安装文件的制作小技巧

最近又一个项目接近尾声,不过对方要求安装必须傻瓜化,尽量不用手动配置。于是就的重新捡起两三年没有用过的installshield了。找到 installshield 12 于是,着手开始制作安装包。因为是网站项目,所以,其他方面倒是问题不大,因为当年用installshield 6.2的
    最近又一个项目接近尾声,不过对方要求安装必须傻瓜化,尽量不用手动配置。于是就的重新捡起两三年没有用过的installshield了。找到 installshield 12  于是,着手开始制作安装包。因为是网站项目,所以,其他方面倒是问题不大,因为当年用installshield 6.2的时候,也是相当熟练的。最主要的有两个方面:一、数据库的安装,因为我的数据库里面有许多存储过程和初始数据,所以不想直接用script来初始化。于是就想直接在安装包中把数据库文件和日志文件打包,然后在安装时直接附加就行。二、修改web.config文件中的数据库连接字符串和一些相关的参数,比如一些路径相关的参数等等。
其中第一点经过摸索和总结,有两种方法:1、直接使用自定义的函数,声称sql语句,然后调用osql.exe来执行。
函数如下:
function number createdatabase(svsqlsvr,svsqlusr,svsqlpwd) 
string szcmdline,szwaittxt; 
begin 
szwaittxt= 正在创建所需数据库.; 
sdshowmsg (szwaittxt, true); 
delay(2);
if(g_bwinlogin) then
    szcmdline = /e  /s +svsqlsvr+ /q /exec  sp_attach_db  @dbname  =  n'dlbj',@filename1  = n'+targetdir ^mydb.mdf',@filename2  = n'+targetdir ^dlbj_web_log.ldf'/; 
 else
   szcmdline = /u +svsqlusr+ /p +svsqlpwd+ /s +svsqlsvr+ /q /exec  sp_attach_db  @dbname  =  n'dlbj',@filename1  = n'+targetdir ^dlbj_web.mdf',@filename2  = n'+targetdir ^mydb_log.ldf'/; 
 endif; 
//szcmdline = /u +svsqlusr+ /p +svsqlpwd+ /s +svsqlsvr+ /q /exec  sp_attach_db  @dbname  =  n'dlbj',@filename1  = n'+targetdir ^dlbj_web.mdf',@filename2  = n'+targetdir ^dlbmydb_log.ldf'/;
if (launchappandwait(osql.exe, szcmdline,wait)  0) then 
messagebox (数据库创建失败!请确您的系统中已安装 microsoft sql server 2000. 如仍无法解决,请联系系统供应商!,severe); 
endif; 
sdshowmsg (szwaittxt, false); 
szwaittxt= 正在优化系统数据库.; 
sdshowmsg (szwaittxt, true); 
delay(2); 
szcmdline = /u +svsqlusr+ /p +svsqlpwd+ /s +svsqlsvr+ /q /use dlbj ; exec sp_updatestats/; 
if (launchappandwait(osql.exe, szcmdline,wait)  0) then 
messagebox (数据库优化失败!您可以在 sql查询分析器中执行 use dlbj ; exec sp_updatestats 完成!,severe); 
endif; 
sdshowmsg (szwaittxt, false);
return 0;
end; 
然后在onend中执行如下代码:
if !maintenance then
createdatabase(g_szserver,g_szuser,g_szpassword);
endif;
 其中,g_szserver,g_szuser,g_szpassword分别为,在installshield中数据库设置界面(或者自定义窗口)中操作得到的服务器地址,用户名和密码。
2、直接在 安装设计视图中创建连接后,直接创建一个sqlscript,会在安装的时候直接执行。这样的话就的提前知道安装的位置(这是不可能的),于是就直接写成可替换的字符串,然后使用 text replacement 选项卡,设置替换项。其中,sqlscript如下:
use master; 
 go
-- drop database if it exists. 
if exists (select name from sys.databases where name = 'dmydb') 
   drop database dmydb; 
go
create database dlbj on primary 
   (filename = 
      '%text_to_be_replaced_in_the_file%/dmydb.mdf')
   log on (filename = 
      '%text_to_be_replaced_in_the_file%/dmydb_log.ldf')
   for attach;
go
其中:%text_to_be_replaced_in_the_file% 是要替换为安装目录的字符串。
这里有个值得注意的地方,如果是installscript项目。那么,在text replacement 选项卡,替换后的内容不能直接设置为[installdir]或者 [targetdir],而是要同样设置为一个替换变量,如:,即就是,把:%text_to_be_replaced_in_the_file% 替换为:,然后在 installscript 的 dlg_sdaskdestpath2: 代码段中,执行如下语句即可。
textsubsetvalue (, targetdir , true );
当时这里困扰我很长世界,最后还是上国外的网站上找到了解决方案。
对于第二点,则,直接使用函数:
function updatekey( svfilepath, svfindentry, svnewentry)
 number nresult, nvlinenumber;
 string webconfigfile, svreturnline;
begin
  // build the path to the web.config     
  webconfigfile = svfilepath ^ web.config;
// search the file for the key we specify
  nresult = filegrep( webconfigfile, svfindentry, svreturnline, nvlinenumber, restart );
  switch(nresult)
   case 0:
    // since this line normally appears twice in our web.config file, we're 
    // checking for the existence of a 2nd match and updating it instead.
    // if there is no 2nd match, go ahead and update the one we find.
    if ( svfindentry = connectionstring ) then
     nresult = filegrep( webconfigfile, svfindentry , svreturnline, nvlinenumber, continue );
     if ( nresult  0 ) then
      filegrep( webconfigfile, svfindentry, svreturnline, nvlinenumber, restart );
     endif;
    endif;
// once we find the key, update (replace) it with our new values
    if ( fileinsertline( webconfigfile, svnewentry, nvlinenumber, replace )  0 ) then
     // hmmm we couldn't update the value of the key
     messagebox( unable to update web.config file., severe );
    endif;
   case -2:
    // file not found
    messagebox( web.config file not found., severe );
   case -4:
    // eof reached
    messagebox( svfindentry +  key not found., severe );
   default:
    //unknown error
    messagebox( an unknown error has occurred. the web.config file has not been updated., severe );
  endswitch; 
 end;
即可。
其它类似信息

推荐信息