全部家当求一个问题的思路???(125分)

  • 主题发起人 主题发起人 jwrjnh
  • 开始时间 开始时间
J

jwrjnh

Unregistered / Unconfirmed
GUEST, unregistred user!
如何实现象瑞星软件一样的在线升级功能????各位大侠给个思路或其他帮助.多谢啦!!!!
 
以前我做过,但现在想不起了,你先在网上查查.不行再和我联系.
 
我制作了好多。

思路一:
1。主要开发一个update.exe,这个文件读取服务器配置
2。但是我是局域网的。客户端的配置要写明升级目录比如//server/update
3。服务器端server/update目录下的update.ini
行如:
[升级版本]=1.100
[升级必须性]=必须
[目录数=1
[文件数]=1
[文件列表],以及目录列表
[更新exe]
方法是客户端读取exe版本,如果版本小于升级版本,判断升级是否必须强制,开始升级,如果需要更新本身exe,关闭本身,启动update.exe.这个update根据update.ini进行建立目录并且下载(局域网是复制到本地)。完成后由update.exe重新启动客户端程序。
---
广域网络
1。通过客户端发送信息,比如使用udp技术,看是判断版本和升级程度,进行关闭本身,启动update.exe下载升级文件。进行下载。
如果需要不需要关闭,需要把下载文件临时存放到一个目录,写一个配置说明。
之后把临时文件COPY回来。
 
使用第三方控件
 
有个update控件听好用的
需要我给你哈
chuanfachen@163.com
 
软件框架做成插件模式。 不是插件也行。 系统本地有更新版本记录。 网上有个最新版本列表,每次到指定网页对比, 更新程序最好做成单独的,每次更新时启动更新 程序。 用覆盖就可以, 如果是一个exe的, 比较死板,这样可以用下面代码更新。

unit uautoupdate;
//this unit is used to auto download and replace a .exe or .dll file

//just call TAutoUpdate.create(hinstance,info_url,cversion)

//hinstance: the module you want to replace
//info_url: an http or ftp url which contain the information of an new version
// the format is: version=... <CR> url=...<CR> filesize=... <CR>
//cversion: current version of the file
interface

uses
Classes,Windows,Urlmon,sysutils,Inifiles,WinINet;

type
TAutoUpdate = class(TThread)
private
finfo_url,fversion,ffilename:string;
protected
procedure Execute; override;
public
constructor create(hinstance:thandle;info_url,cversion:string);
end;

implementation
function HTTPRequest(const URL:String):string;
var
HFile,HInet: HINTERNET;
Buffer : array[0..32767] of char;
BufRead : Cardinal;
BufSize:Cardinal;

const
Agent = 'Netbar';
begin
HInet := InternetOpen(Agent,INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
result:='';
if Assigned(HInet) then
try
HFile := InternetOpenUrl(HInet, PChar(URL), nil, 0, INTERNET_FLAG_RELOAD+INTERNET_FLAG_KEEP_CONNECTION, 0);
if Assigned(HFile) then
try
BufSize:=SizeOf(Buffer);
while InternetReadFile(HFile, @Buffer, BufSize, BufRead) and (BufRead > 0) do
begin
Buffer[BufRead]:=#0;
result:=result+PChar(@Buffer);
end;
finally
InternetCloseHandle(HFile);
end;
finally
InternetCloseHandle(hinet);
end;
end;


procedure MoveFile(src,dst:string);
var MyIni: TIniFile;
begin
if GetVersion<$80000000 then // Windows NT/2000/XP
begin
MoveFileEx(Pchar(src),Pchar(dst),MOVEFILE_DELAY_UNTIL_REBOOT);
end else
begin // Windows 32s/95/98/Me
MyIni := TIniFile.Create('WININIT.INI');
Myini.WriteString('rename',ExtractShortPathName(dst),ExtractShortPathName(src));
MyIni.free;
end;
end;
constructor TAutoUpdate.create(hinstance:thandle;info_url,cversion:string);
var
filename:array[0..MAX_Path] of char;
begin
finfo_url:=info_url;
fversion:=cversion;
getmodulefilename(hinstance,filename,sizeof(filename));
ffilename:=strpas(filename);
inherited create(false);
end;

function Get_FileSize(FileName : String) : Integer;
var
F : THandle;
fSize : DWORD;
begin
//Open up file
F := CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL OR FILE_FLAG_NO_BUFFERING, 0);
fSize := GetFileSize(F, nil); //Get the file's size
CloseHandle(F);
Result :=fsize;
end;

procedure TAutoUpdate.Execute;
var
info:string;
param:TStringList;
newversion,url:string;
begin
info:=httprequest(finfo_url);
param:=TStringlist.Create;
param.Text:=info;
newversion:=param.Values['version'];
if newversion<=fversion then exit;
url:=param.values['url'];
if S_OK<>urldownloadtofile(nil,pchar(url),pchar(ffilename+'.tmp'),0,nil) then exit;
if inttostr(Get_FileSize(ffilename+'.tmp'))<>param.values['filesize'] then exit;
MoveFile(ffilename+'.tmp',ffilename);
end;

end.
 
你可以用全文搜索一下,有很多这方面的例子.
 
后退
顶部