冷枫@CSDN

CSharp程序员大本营:积累平凡就是积累卓越!有了翅膀,你就有了天空!钝到极点的刀才最具杀伤力——因为它是锤子!

用户操作
[即时聊天] [发私信] [加为好友]
╄ 冷枫ID:JavaProgramers
483961次访问,排名98好友111人,关注者144
毕业于南阳理工学院计算机系软件工程专业,一直从事于软件开发工作,编程经验5年,一线程序员出身,开发实战经验丰富,精通Asp,Asp.NET, ERP(C#.NET),基于WEB(Asp.Net)的MIS等世道上的一般编程,精通SQL Server存储过程开发,曾为一家中型商务企业软件开发工程师,软件培训师。
JavaProgramers的文章
原创 287 篇
翻译 0 篇
转载 24 篇
评论 441 篇
╄ 冷枫的公告
╄ 冷枫 Asp.NET微软MVP
本Blog技术支持QQ群
[NET技术联盟]:1908832
[冷枫开发小组]:6307410
CSharp开放源码促进会
CSharp程序员大本营
最近评论
反对垄断:现在都在卖服务,软件都是白送的,微软降到100多就想笼络人心,做梦,微软迟早要完蛋
wyw_2002:“中国用户的计算机中60%都运行微软的操作系统“

请问这个60%是你统计的吗?
那40%是什么系统?

捡瓶子:废瓶子1角钱一个,一天捡100个,10元,跑去吃饭8元,买个XP,也要捡2年啊!
zenggang2008:反击盗版,在中国还有很长的路要走啊
大家都已经习惯"免费"了
路过:盗版不利于中国的软件业的发展,最终用户好像在盗版软件中得到了很多的好处,但是把中国的软件产业搞垮了。最终用户最后还是受害者。
文章分类
收藏
    相册
    IT英雄传奇
    大学留念集
    公司一角
    旅游系列二
    旅游系列三
    旅游系列一
    [╄ 冷枫]简介
    站长简介(RSS)
    经典网站收集
    .NET分页存储过程
    AJAX中国
    DOTNET控件网
    DotNet男孩社区
    Java共舞
    Tutorails[.NET]
    中国盟动力
    冷枫技术论坛
    开发者在线
    技术无极限(RSS)
    深圳赶集网
    源码网
    软件项目网
    网上邻居
    『 天道酬勤 』(RSS)
    『 孟子E章 』(RSS)
    『 孟子E章 』
    『 邹建专栏 』(RSS)
    『webdiyer 』
    微软官方
    ASP.NET 入门教程
    webcast视频教程
    存档
    订阅我的博客
    XML聚合  FeedSky

    原创 怎样用installshield12做升级程序收藏

    新一篇: InstallShield 12.0 简介 | 旧一篇: installshield 12较6.0生成MS SQL数据库策略

    我用的是installshield12,我先说明,installshield12做的安装程序本身,是可以设置成自动检测有没有新的版本的,嗯,我不懂怎么搞,我想了这样的办法,这样的办法可以用在installshield 6.x的版本里的

    这个办法要求在做安装程序的时候,一定要先在注册表里写上程序的安装路径和机器类型

    安装路径就是程序安装在什么路径下了,在installshield里是由变量TARGETDIR记录的,我在注册表里,用了install这样的健值记录

    机器类型就是安装程序的机器是做什么用的,有的机器安装程序,是用来做服务器的,这个机器上面带有数据库,升级的时候,有时要升级数据库的,我选择在服务器上升级数据库,有的机器安装程序,是用来做客户端的,这个机器上面没有数据库,升级的时候,要跳过数据库升级部分

    我测试了一个项目,在注册表里,我写了这样的一个注册项:HKEY_LOCAL_MACHINE\SOFTWARE\NNLL,在这个注册项下面,我有两个键值,一个是install,记录安装路径,一个是sc,记录机器类型

    这些注册项怎么在安装程序里写进去,可以查看这篇博客:
     
    http://blog.csdn.net/JavaProgramers/archive/2008/04/15/2293118.aspx

    这里讲的是怎么利用这两个注册表键值做一个可以自动升级数据库和文件的升级程序

    新键一个安装工程,设置要安装的文件,全都和普通的安装程序一样做法,不同的地方是Installation Interview这一步,这里有四个设置:

    第一个Licerse Agreement Dialog,是设置要不要显示软件协议

    第二个prompt users to enter their Company Name and User Name,是设置要不要用户在安装时输入公司名和用户名

    第三个modify the installation location of your application,是设置可以不可以让用户选择安装路径

    第四个selectively install only certain parts of your application,是设置可以不可以让用户选择安装程序里的哪部分内容

    这四个东西,在升级的时候全都用不上,全部都设置成NO

    还有一个不同呢,就是因为升级程序一般都是单个文件的好,所以在Build Installation里,要选择Single Executable,这样安装包到最后就会被打包成一个单一的文件了

    最后呢,就是修改安装脚本,修改OnFirstUIBefore函数,在声明变量的部分,要添加五个变量,szPath是记录安装路径的,szServer是记录机器类型的

    //NNLL添加变量
        string szPath,szServer;
        string szKey;
        number nType,nRootKey; 
        //NNLL
    添加结束

    Dlg_SdFeatureTree后,添加下面的脚本,读取安装路径和机器类型,设置安装路径

    //提取注册表,取安装路径和是否服务器端
    //
    置根为nRootKey
     nRootKey = HKEY_LOCAL_MACHINE;                
     RegDBSetDefaultRoot (nRootKey);
     //
    取安装路径

     szKey="SOFTWARE\\NNLL";
     if RegDBKeyExist(szKey) = 1 then
        //
    存在这个项,取这个项下的键值
        nSize=-1;
        nType=REGDB_STRING; 
        //
    取安装路径
        szName="install";
        RegDBGetKeyValueEx (szKey, szName, nType, szPath, nSize);
        //
    取是否服务器端
         szName="sc";
        RegDBGetKeyValueEx (szKey, szName, nType, szServer, nSize);
        //
    设置安装路径
        TARGETDIR=szPath;
     else
        //
    如果没有这个注册项,退出升级程序
        MessageBox("
    升级程序在非法安装的程序上无效,请购买正版软件",SEVERE);
        abort;
     endif; 

    上面取到的szServer是机器类型,要根据这个的值,判断是不是要用升级数据库,很简单的,给Dlg_SQLServerDlg_ObjDialogs加上判断就行了

    if szServer="S" then
    //
    如果是服务器端的,就升级数据库

    Dlg_SQLServer:
        nResult = OnSQLServerInitialize( nResult );
        if( nResult = BACK ) goto Dlg_SdFeatureTree;

    Dlg_ObjDialogs:
        nResult = ShowObjWizardPages( nResult );
        if (nResult = BACK) goto Dlg_SQLServer;
    endif;

    这段是判断sc,如果值是S,就是服务器机器,要升级数据库

    下面我说一下升级数据库的问题,在Server Configuration->SQL Script里,添加连接,给连接添加一个sql脚本,把你的数据库要升级的东西,全都写在脚本里,就可以了

    看我这一段,我在数据库里,有一个表,叫nnll_version,里面有一个build字段,是记录补丁号的,我每次升级,最少也要把这个补丁号写上,所以我的最简单升级脚本就是这个

    use NNLLTABLE
    declare @build varchar(20)
    select @build=build from nnll_version
    if ( @build<'20061117' )
       begin
         update nnll_version set build='20061117'
       end
    go

    关于升级数据库脚本的设置,详细的可以看这篇博客:
    http://blog.csdn.net/JavaProgramers/archive/2008/04/15/2293879.aspx

    下面呢,我再说这个升级的安装程序搞好后,每个版本要怎么搞,嗯,我的意思是啊,我在20061117升级了程序,我做了一个升级程序的工程,如果我在20061217程序又要升级了,我们不用重新做一个升级程序的工程的,修改下面几项:

    1、项目名称:菜单Project->Settings,在Application标签,修改Product的设置,我是这样设置的:NNLL的软件 v1 build 20061117 升级程序

    2、要升级的文件:Organization->Setup Design,在这里,要重新设置对应的Component里面的Static File Links,把原来的文件去掉,换上新的文件就可以了

    3、要升级的数据库脚本:Server Configuration->SQL Scripts,在这里,把你的脚本重新修改成新的

    4、安装包的名字:Media->Releases,选中你的安装包,补丁文件都是单文件的好,所以呢,是SINGLE_EXE_IMAGE,选中这个,就可以修改他的属性了,修改Single Exe File Name,我是修改成:NNLL软件v1build20061117补丁.exe

    5、项目名称:菜单Project->Settings,在Application标签,Product那一栏的id编号,点击Change按钮,这样第二次使用这个projcetbuild出来的升级程序时,就不会叫你卸载

    最后呢,就是重新生成安装包:菜单Build->Build SINGLE_EXE_IMAGE,等生成完了,你就可以在Media\SINGLE_EXE_IMAGE\Package目录下找到你的升级程序了

    我说一下我的这个办法有什么不好的地方

    1、我放成installshield11.5的新功能不用,自己想了一个办法,嗯,是因为我对着一堆的英文,看得很辛苦,对中文也辛苦

    2、如果有坏蛋的用户,他们升级客户端机器,不升级服务器,那我的数据库就变成没有升级了,如果升级程序有动了数据库结构,那新的文件版本就对不上旧的数据库了,客户端运行的时候,肯定会报错,用户就肯定会找你的,说你的软件出错了

    我想过这个的解决办法,就是要读取数据库的信息,如果数据库里面build字段是>=当前升级脚本的补丁号的,那就允许升级客户端机器,else呢,来一个

    MessageBox("请先升级服务器",SEVERE);
        abort;

    嗯,我不知道怎么在installshield的脚本里读数据库里的build的值,所以我不知道这个办法怎么搞

    我想过把这个数据库的版本号写在注册表里,那就要安装程序也修改了,要再加一个注册表键值,好麻烦啊,我不要搞了,谁喜欢,谁搞

    3、反安装的问题,这样子搞法,连补丁都可以反安装了,还要是反安装补丁后,是把补丁里面的文件删除的,就是说呢,如果有用户反安装了补丁,那我们的软件就变成少了几个文件了,安装程序是可以设置不可以反安装的,我现在还不懂怎么搞.

    发表于 @ 2008年04月15日 14:57:00|评论(loading...)|编辑

    新一篇: InstallShield 12.0 简介 | 旧一篇: installshield 12较6.0生成MS SQL数据库策略

    评论:没有评论。

    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © ╄ 冷枫