用pb实现cs应用程序的自动升级

  • 格式:doc
  • 大小:32.00 KB
  • 文档页数:3

用PB实现C/S应用程序的自动升级
黄石纺织机械厂信息中心黄新民 2007.9.5
C/S模式的应用程序安装在客户端,一旦程序改动升级,更换应用程序的工作量大。

但由于它与B/S模式相比具有交互能力强、运行速度快的优点,目前在企业管理内部的ERP等应用中还是得到比较广泛的应用。

企业的信息化是一个长期的、不断进步的过程,所以应用程序的修改和升级也是经常发生的。

目前企业的信息化应用都达到一定的规模,客户端的数量至少也在几十台以上。

一旦对应用程序进行修改,及时地更换客户端应用程序的工作量是很大的。

怎样在C/S模式下实现应用程序的自动升级呢?下面介绍一种PB开发的应用程序实现自动升级的方法。

自动升级的核心是在应用程序的启动程序段加入判别版本信息的代码,版本有效就直接进入应用系统,否则进行升级。

实现这种自动升级的过程比较简单:
1.将当前应用程序变为过时的旧版
在数据库中建立一个版本信息表bbxx,表的结构包含系统名(xtname)和版本号(bbh)两个字段,例如
序记录的版本号信息进行比较,若相同则正式运行应用程序;不同则进行版本的自动更新。

采用这种方法的优点是能及时地停止所有客户端旧版应用程序的运行,从而保证不会出现由于旧版更换不及时而造成的数据混乱。

2.确定当前应用程序所在的位置
应用程序在客户端安装的位置可能各不相同,确定其在客户端的安装位置才能保证新程序的正确替换。

3.自动建立网络资源,连接网络内新版应用程序所在的目录,拷贝新文件
在网络内确定一台计算机,并设定一个放置新版pbd文件的共享文件夹。

在应用程序应用的Open事件中编写代码,建立网络资源,连接到共享文件夹,复制新文件。

4.断开网络资源
5.重新登陆进入新版应用程序
在PB中实现上述过程的详细步骤:
1.声明外部函数
FUNCTION Long WNetAddConnection2 ( REF NETRESOURCE lpNetResource, String lpPassword, String lpUserName, Long dwFlags) LIBRARY "mpr.dll" ALIAS FOR "WNetAddConnection2A" FUNCTION Long WNetCancelConnection2 (String lpName, Long dwFlags,Long fForce) LIBRARY "mpr.dll" ALIAS FOR "WNetCancelConnection2A"
2. 建立结构
3.
// 建立与数据库的连接-------------
……
connect USING SQLCA;
if sqlca.sqlcode <> 0 then
messagebox('提示', '不能连接数据库!')
halt
end if
// ----------------------------------------
string bbh1
select bbh into :bbh1 from hsfj.bbxx where xtname = '采购管理'; //得到当前有效的版本号
if bbh1='2007.9.2A' then // 每次修改结束编译新的可执行文件前,将数据库的版本信息表的版本号
字段改为新值,同时修改此处引号内的值与其一致。

编译完成后将新文
件复制到网络中用于发布新文件的计算机的共享文件夹中。

open(w_main) // 进入应用系统
else
messagebox('提示','不是最新版本!')
string currentdir, filename
int c1,c2,c3
// 确定当前目录------------------------------
currentdir=GetCurrentDirectory()
if pos(currentdir,'桌面')>0 then
messagebox('警告','快捷方式的起始位置不对,不能升级!请找系统管理员')
return
end if
// ---------------------------------------------------
// 连接到指定的网络资源(共享文件夹)-----------------
netresource netr
long ll_errinfo
string ls_mypass, ls_myuser
netr.dwscope=2
netr.dwtype=1
netr.dwdisplaytype=3
netr.dwUsage=1
netr.lpRemoteName='\\hxm\exe_cggl' // 共享文件夹的位置和名称
ls_myuser='hxm' // 连接共享文件夹的用户名
ls_mypass='aaa' // 连接共享文件夹的密码
ll_errinfo=WnetAddConnection2(Netr,ls_mypass,ls_myuser,1) // 调用外部函数进行网络连接if ll_errinfo<>0 then
Messagebox('提示','网络连接不成功!升级失败,请确认应用程序服务器在线')
return
end if
// -------------------------------------------
// 复制新文件(此处假设有三个新文件aaa.pbd、bbb.pbd和ccc.pbd) -------
filename=currentdir+"\aaa.pbd";
c1=filecopy("\\hxm\exe_cggl\aaa.pbd",filename,true)
filename=currentdir+"\bbb.pbd";
c2=filecopy("\\hxm\exe_cggl\bbb.pbd",filename,true)
filename=currentdir+"\ccc.pbd";
c3=filecopy("\\hxm\exe_cggl\ccc.pbd",filename,true)
if c1+c2+c3=3 then
messagebox('提示','升级成功!请重新启动采购管理系统')
else
messagebox('提示','升级失败!请找系统管理员。

' )
end if
// ------------------------------------------------------------------------------------------------
// 断开指定的网络资源--------------
string ls_localname
ls_localname='\\hxm\exe_cggl'
ll_errinfo=WnetCancelConnection2(ls_localname,1,0) // 调用外部函数断开指定的网络资源// --------------------------------- ----------
end if
我在企业的信息化实践中采用上述方法,解决了应用程序升级困难的问题,并能保证所有的应用程序及时升级,杜绝了新旧版本的混用。

如果稍加改进,可以设计成通用的升级程序。

将版本号、系统名、应用程序名、共享文件夹位置、升级文件名称及数量等写进ini文件,通过读取ini文件来动态地更换上述值,从而使升级程序通用化。

需要注意的是应用程序当前位置的确定,需要另外编写代码。