这个办法要求在做安装程序的时候,一定要先在注册表里写上程序的安装路径和机器类型
安装路径就是程序安装在什么路径下了,在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_SQLServer和Dlg_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按钮,这样第二次使用这个projcet,build出来的升级程序时,就不会叫你卸载
最后呢,就是重新生成安装包:菜单Build->Build SINGLE_EXE_IMAGE,等生成完了,你就可以在Media/SINGLE_EXE_IMAGE/Package目录下找到你的升级程序了
我说一下我的这个办法有什么不好的地方
1、我放成installshield11.5的新功能不用,自己想了一个办法,嗯,是因为我对着一堆的英文,看得很辛苦,对中文也辛苦
2、如果有坏蛋的用户,他们升级客户端机器,不升级服务器,那我的数据库就变成没有升级了,如果升级程序有动了数据库结构,那新的文件版本就对不上旧的数据库了,客户端运行的时候,肯定会报错,用户就肯定会找你的,说你的软件出错了
我想过这个的解决办法,就是要读取数据库的信息,如果数据库里面build字段是>=当前升级脚本的补丁号的,那就允许升级客户端机器,else呢,来一个
MessageBox("请先升级服务器",SEVERE)
abort
嗯,我不知道怎么在installshield的脚本里读数据库里的build的值,所以我不知道这个办法怎么搞
我想过把这个数据库的版本号写在注册表里,那就要安装程序也修改了,要再加一个注册表键值,好麻烦啊,我不要搞了,谁喜欢,谁搞
3、反安装的问题,这样子搞法,连补丁都可以反安装了,还要是反安装补丁后,是把补丁里面的文件删除的,就是说呢,如果有用户反安装了补丁,那我们的软件就变成少了几个文件了,安装程序是可以设置不可以反安装的,我现在还不懂怎么搞.
Windows XP 计算机包含自动升级功能,它可以在计算机开启并且已连接到 Internet 时自动下载最新的 Microsoft 安全升级程序。要最大限度发挥"自动更新"的功能,请首先在 PC 上运行 Windows Update 扫描。1、单击"开始"、"所有程序",然后单击"Windows Update"。
2、根据屏幕上的提示 *** 作。Windows Update 将扫描计算机,并给出重要升级的预先选择列表。提示:要减少下载时间,请在计算机没有执行其他任务时运行 Windows Update。下载时间会根据下面的因素而变化:此次更新与上次更新的时间间隔、下载的文件的数量和大小以及调制解调器的速度。
注意:当首次使用 Windows Update 时,较慢的调制解调器可能需要几个小时下载所有建议的更新程序。
3、安装更新程序。(提示:某些更新程序要求满足一些先决条件,因此系统可能要求你安装特定的更新程序,然后重新启动计算机。一定要在重新启动之后返回到 Windows Update,检查是否有其他需要下载的程序。可能需要反复执行此步骤。)
如果你的Windows XP 已经是最新的了,可以通过"自动更新"建立定期的维护计划。
1、单击"开始",然后单击"控制面板"。
2、单击"性能和维护"。提示:如果看不?quot性能和维护"类别,请单击窗口左上角的"切换到类别视图"。
3、单击"系统"图标打开"系统属性"对话框。
4、在"自动更新"选项卡中,选中"保持我的计算机最新"旁的复选框。
5、选择一项设置。Microsoft 强烈建议选择"自动下载更新,并按照我指定的日程安排安装它们"。
6、如果选择自动下载并安装更新的选项,则必须选择计算机安装已下载更新的日期和时间。使用此选项,当计算机连接到 Internet 时系统会在后台下载更新。(提示:请确保将日期和时间设定在您的计算机通常会开机的时间。我们建议每天更新。在离开计算机之前一定要保存工作,因为某些下载要求计算机重新启动)。
Windows 自动更新是 Windows 的一项功能,当适用于您的计算机的重要更新发布时, 它会及时提醒您下载和安装。使用自动更新可以在第一时间更新您的 *** 作系统,修复系统漏洞,保护您的计算机安全。
Windows XP 计算机包含自动升级功能,它可以在计算机开启并且已连接到 Internet 时自动下载最新的 Microsoft 安全升级程序。要最大限度发挥"自动更新"的功能,请首先在 PC 上运行 Windows Update 扫描。
1、单击"开始"、"所有程序",然后单击"Windows Update"。
2、根据屏幕上的提示 *** 作。Windows Update 将扫描计算机,并给出重要升级的预先选择列表。提示:要减少下载时间,请在计算机没有执行其他任务时运行 Windows Update。下载时间会根据下面的因素而变化:此次更新与上次更新的时间间隔、下载的文件的数量和大小以及调制解调器的速度。
注意:当首次使用 Windows Update 时,较慢的拦亩调制解调器可能需要几个小时下载所有建议的更新程序。
3、安装更新程序。(提示:某些更新程序要求满足一些先决条件,因此系统可能要求你安装特定的更新程序,然后重新启动计算机。一定要在重新启动之后返回到 Windows Update,检查是否有其他需要下载的程序。可能需要反复执行此步骤。)
如果你的Windows XP 已经是最新的了,可以通过"自动更新"建立定期的维护计划。
1、单击"开始",然后单击"控制面板"。
2、单击"性能和维护"。提示:如果看不?quot性能和维护"类别,简纯森请单击窗口左上角的"切换到类别视图"。
3、单击"系统"图标打开"系统属性"对话框。
4、在"自动更新"选项卡中,选中"保持我的计算机最新"旁的复选框。
5、选择一项设置。Microsoft 强烈建议选择"自动下载更新,并按照我指定的日程安排安装它们"。
6、如果选择自动下载并安装更新的选项,则必须选择计算机安装已下载更新的日期和时间。使用此选项,当计算机连接到 Internet 时系统会在后台下载更新。(提示:请确保将日期和时间设定在您的计算机裤备通常会开机的时间。我们建议每天更新。在离开计算机之前一定要保存工作,因为某些下载要求计算机重新启动)。
如果需要关闭的话,执行如下 *** 作:
右键点击‘我的电脑’-属性-自动更新-关闭自动更新之后。然后(1)“开始”菜单---“设置”---“控制面板”---“性能和维护”---“管理工具”---服务---“Automatic Updates”(按名称排序第四行)。
(2)右键单击后出现“Automatic Updates的属性(本地计算机)”对话框。
(3)在“启动类型”中有三个选项分别是;自动、手动、已禁止,系统默认为自动状态,也是就是说可以自动下载。现将“启动类型”改为“已禁止”,单击“应用”后就关闭了上网自动更新
冷静地分析了一下程序说明:1 web站点一个 用途:A.提供下载源(dll,exe,图片...等等...所有最新文件) B.那个啥...嗯....弄个页面,输出xml格式的数据(用response.write输出)这个xml数据要体现,当前版本号,文件名等信息,就是把DataTable以xml表现出来形如以下。(当然,完全可以用WebService,只是个人认为用xml更专业,更节约)2 升级程序一个 用途:A.负责判断是否需升级 B.下载需要升级的文件 C.将老文件替换成新文件3 你要升级的程序,在此不多说。看接下来的细节。 很重要的说明:升级程序是一个独立的exe文件,让它跟主程序打包在一起,安装后在同一个目录下边。前面三个程序相辅相成,才能完成自动升级更新。看细节吧。 接下来是细节了,很冷静的细节,你运气好,碰上我今天刚好心情差,给你说详细。(1,2,3....表示步骤)1步:往web站点中传文件,记得接收文件的时候改一下后缀名(统一改为.rar或.txt)这样,web服务器(IIS)不会因为安全因素将特别文件(.dll,.exe等)拒之门外。同时,往数据表中记录以下属性梁携(文件真实名[如:ABC.exe]、文件下载地址、相对根路径的路径、文件版本号[有版本号的(如:dll,exe)取版本号,没版本号的(如:jpg)取MD5值])特别说明:版本号、你可以百度“C#获取文件版本号”获取相关代码。 很尴尬 ==! 这里有一步要说明一下:主程序启动时,启动升级程序(Process可做到)有问题百度“C#启动其它应用程序” 2步:升级程序请求生成xml的页面(实际上就是一个aspx,只是输出的内容是 xml 形式的,用response.write输出),或者你直接用webservice提供一个方法返回第一步中提及的数据表(DataTable). 3步:升级程序将xml内容转译成datatable、如果用webservice这一步就省了。 4步:升级程序遍历第三步获取的datatable、根据"相对根路径的路径"获取本地老文件的信息,如果本地有文件,就获取版本号,或者MD5值,如果本地没有文件、或版本号不等、或者MD5值不等则表示这个文件得更新(把这条信息(DataRow)存入队列(数组))这一步,知道了有哪些文件需要下载。 5步:升级程序根据第 4步 中得到的队列逐一下载文件到 (Temp目录) 6步:升级程序关闭主程序进程(Process类可做到),有问题可以 百度“C#结束其它进程”,这样要杀要剐老文件就随你了,因为它们将不再被其它进程所橡孝伏占有。 7步:升级程序将第 5步 中下载的文件根据 "相对根路径的路径" 字段逐一移到对应目录,将老文件替换。 8步:工作完成,升级程序启动主程序(Process类可以做到) 有问题可以百度“C#打开其它exe” 9步:没了,没啥好说的了。 下载可以用:httprequest,httpresponse这两个类,具体见msdn,用它们可做断点续传,实时进度条,多线程下载。你还可以用WebClient它不怎么样,一次下一个文件,无法实现断点续传,无法实时获取进度,最重要的一点,用它显得不专业。 思路在这了,绝对错不了。我叫绿豆蛙,别人喜欢叫我三爷,我很多年没碰C/S了,幻想有一天还能做个C/S的项目。哥哥我今天心情不好,因为我快结婚了,慎老压力特别大。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)