请问各位高手,在Delphi里用什么自动升级组件可以实现软件自动升级功能啊? 谢谢

解决方案 »

  1.   

    自己写吧,思路如下:1. 开发一个小执行档,如LiveUpdate.exe。2. 将最新的执行档上传到数据库或服务器上某个共享目录;3. 在Client.exe启动时,从服务器上下载最新的执行档(含LiveUpdate.exe),并存放到Cache目录下,然后呼叫LiveUpdate.exe;4. LiveUpdate.exe在启动时,先关闭Client.exe进程,然后将Cache目录下所有新版本文件覆盖如Client.exe等主文件;5. LiveUpdate.exe在更新完本地的所有执行档后,启动Client.exe, 并关闭LiveUpdate。以上是常规做法,如果你有兴趣,也可以把Client.exe与LiveUpdate共用一个执行档。试试看。
      

  2.   

    看看socket编程,你可以使用indytcp组件在服务器上下载更新文件
      

  3.   

    办法很多,可以用indytcp组件,也可以把升级文件放到数据库中
      

  4.   

    好象有现成的组件,比如这个
    http://www.2ccc.com/article.asp?articleid=3344
      

  5.   

    还有这个,不用组件的例子:
    http://www.2ccc.com/article.asp?articleid=2846盒子上这种东东很多,你自己看吧!
      

  6.   

    AutoUpgrader Pro v4.6.4,这个我以前找到了,可是没有什么实例,能不能介绍一些呢?多谢!
      

  7.   

    自己做一个,不用组件。用indyHTTP或indyFTP挺容易的
      

  8.   

    sz9214e 说得很详细了,什么自动更新,就是一些配置文件,配置好了,软件根据配置文件进行下载文件,然后进行覆盖即可.
      

  9.   

    我这里有文件传输的一些原代码,看看对你有没有帮助:
    unit ServerFrm;
    interface
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, ComCtrls, StdCtrls, ExtCtrls,WinSock;
    Type
    TfrmMain = class(TForm)
    Panel1: TPanel;
    Label1: TLabel;
    edtPort: TEdit;
    Panel2: TPanel;
    stabar: TStatusBar;
    SaveDialog: TSaveDialog;
    btnListen: TButton;
    btnReceive: TButton;
    btnStop: TButton;
    btnExit: TButton;
    procedure FormCreate(Sender: TObject);
    procedure btnExitClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure btnListenClick(Sender: TObject);
    procedure btnReceiveClick(Sender: TObject);
    procedure btnStopClick(Sender: TObject);
    private
    { Private declarations }
    Public
    { Public declarations }
    StopTrans:Boolean; //是否停止传送开关
    InTrans:Boolean; //表示正在接收文件
    Server:TSocket; //定义服务器端的socket句柄
    //自定义过程接收文件
    procedure RecvFile(FileName:String);
    end;
    var
    frmMain: TfrmMain;
    const
    BlockLen=1024*4;
    implementation
    {$R *.dfm}
    procedure tfrmmain.RecvFile(FileName:String);
    var
    Ftrans:file of Byte;
    Recelen:Integer;
    Blockbuf:array[0..BlockLen-1] of Byte;
    RecvSocket:TSocket;
    ra:Sockaddr_in;
    ra_len:integer;
    begin
    ra_len:=sizeof(ra);
    Recvsocket:=accept(server,@ra,@ra_len);
    assignFile(Ftrans,filename);
    rewrite(ftrans);
    stoptrans:=false;
    intrans:=true;
    recelen:=recv(recvsocket,Blockbuf,BlockLen,0);
    while (recelen>0) and (not StopTrans) do
    begin
    BlockWrite(Ftrans,Blockbuf[0],BlockLen);
    application.ProcessMessages;
    recelen:=recv(recvsocket,Blockbuf,Blocklen,0);
    if stoptrans then
    begin
    CloseFile(Ftrans);
    CloseSocket(RecvSocket);
    InTrans:=False;
    MessageBox(Handle,'停止传输!','提示',MB_OK);
    EXIT;
    END;
    END;
    //关闭文件,接收的SOCKET
    CloseFile(Ftrans);
    Closesocket(recvsocket);
    InTrans:=False;
    if (Recelen=SOCKET_ERROR) then
    messagebox(handle,'传输异常终止!','提示',MB_OK)
    ELSE
    MESSAGEBOX(HANDLE,'客户端已经关闭连接1,文件可能已经传送完毕了!','提示',MB_OK);
    end; 
    procedure TfrmMain.FormCreate(Sender: TObject);
    var
    aWSAData:TWSAData;
    begin
    if WSAStartup($0101,aWSAData)<>0 then
    raise Exception.Create('不能启动WinSock动态链接库');
    messageBox(Handle,aWSAdata.szDescription ,'WinSock动态链接库版本',mb_ok);
    end;
    procedure TfrmMain.btnExitClick(Sender: TObject);
    begin
    Close;
    end;
    procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    if InTrans then
    if MessageBox(handle,'正在接收文件,停止吗?','提示',MB_YESNO)=IDNO then
    abort;
    IF SERVER<>INVALID_SOCKET THEN
    CLOSESOCKET(SERVER);
    //释放winsock动态链接库所创建的资源
    if WSACleanup<>0 then
    messagebox(handle,'清除Winsock动态链接库错误!','提示',MB_OK)
    ELSE
    messagebox(handle,'清除Winsock动态链接库成功!','提示',MB_OK);
    end;
    procedure TfrmMain.btnListenClick(Sender: TObject);
    var
    ca:SOCKADDR_IN;
    begin
    //创建服务器端SOCKET
    Server:=Socket(PF_INET,SOCK_STREAM,IPPROTO_IP);
    IF server=invalid_socket then
    Begin
    stabar.SimpleText :='创建接收SOCKET错误1';
    exit;
    end;
    //绑定服务器端SOCKET
    ca.sin_family :=PF_INET;
    CA.sin_port :=htons(strtoint(trim(edtPort.Text )));
    ca.sin_addr.S_addr :=INADDR_ANY;
    if bind(server,ca,sizeof(ca))=socket_error then
    begin
    stabar.SimpleText :='绑定socket错误,请更改接收端口';
    closeSocket(server);
    exit;
    end
    else
    stabar.SimpleText :='绑定接收端socket成功!';
    //开始监听
    listen(server,5);
    btnlisten.Enabled :=False;
    btnstop.Enabled :=true;
    end;
    procedure TfrmMain.btnReceiveClick(Sender: TObject);
    begin
    if (server=INVALID_SOCKET) THEN
    BEGIN
    MESSAGEBOX(HANDLE,'还没有进行监听,请先进行监听!','提示',MB_OK);
    EXIT;
    END;
    IF SaveDialog.Execute THEN
    RECVFILE(SaveDialog.FileName );
    end;
    procedure TfrmMain.btnStopClick(Sender: TObject);
    begin
    STOPTRANS:=TRUE;
    IF SERVER<>INVALID_SOCKET THEN cLOSESOCKET(SERVER);
    //此处需要说明
    server:=INVALID_SOCKET;
    bTNSTOP.Enabled :=fALSE;
    BTNlISTEN.Enabled :=TRUE;
    end;
    end.客户端:
    unit ClientFrm;
    interface
    uses
    Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
    Dialogs, StdCtrls, ComCtrls,WinSock;
    Type
    TfrmMain = class(TForm)
    opendfile: TOpenDialog;
    Label1: TLabel;
    edtIP: TEdit;
    Label2: TLabel;
    edtPort: TEdit;
    StatusBar: TStatusBar;
    btnConnect: TButton;
    btnSend: TButton;
    btnStop: TButton;
    btnExit: TButton;
    ProgressBar: TProgressBar;
    procedure FormCreate(Sender: TObject);
    procedure btnExitClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure btnConnectClick(Sender: TObject);
    procedure btnSendClick(Sender: TObject);
    procedure btnStopClick(Sender: TObject);
    private
    { Private declarations }
    Client:TSocket;
    Public
    { Public declarations }
    StopTrans:Boolean; //是否停止发送的开发
    InTrans:Boolean; //表示是否正在传送文件
    procedure TransFile(FileName:String); //传递文件的过程
    end;
    const BlockLen=1024*4; //每次发送的最大数据量
    var
    frmMain: TfrmMain;
    implementation
    {$R *.dfm}
    procedure TfrmMain.TransFile(FileName:String); //传递文件的过程
    var
    Ftrans:file of Byte;
    Flen:integer;
    BlockNum,RemainLen:integer;
    BlockBuf:array[0..BlockLen-1] of Byte;
    i:integer;
    SendLen:Integer;
    Begin
    assignFile(Ftrans,filename);
    reset(Ftrans);
    Flen:=FileSize(Ftrans);
    BlockNum:=Flen div BlockLen;
    progressBar.Max :=1+BlockNum;
    RemainLen:=Flen mod BlockLen;
    StopTrans:=False;
    InTrans:=True;
    SendLen:=1;
    for i:=0 to BlockNum-1 do
    begin
    if (StopTrans) or (SendLen<=0) then Break;
    BlockRead(Ftrans,Blockbuf[0],BlockLen);
    SendLen:=Send(Client,Blockbuf,BlockLen,0);
    ProgressBar.Position :=i;
    Application.processMessages;
    end;
    if StopTrans then
    begin
    CloseFile(Ftrans);
    InTrans:=False;
    StatusBar.SimpleText :='';
    MessageBox(Handle,'停止传输!','提示',mb_ok);
    progressbar.Position :=0;
    exit;
    end;
    if (SendLen<=0) then
    begin
    CloseFile(Ftrans);
    InTrans:=False;
    StatusBar.SimpleText :='';
    messagebox(handle,'传出异常终止!','提示',MB_OK);
    progressBar.Position :=0;
    exit;
    end;
    if remainLen>0 then
    begin
    BlockRead(Ftrans,BlockBuf[0],RemainLen);
    SendLen:=send(client,BlockBuf,Remainlen,0);
    if (sendLen<=0) then
    begin
    closeFile(Ftrans);
    InTrans:=False;
    StatusBar.SimpleText :='';
    messagebox(handle,'传输异常终止!','提示',mb_ok);
    progressBar.Position :=0;
    exit;
    end;
    end;
    progressBar.Position :=ProgressBar.Max ;
    CloseFile(Ftrans);
    InTrans:=False;
    StatusBar.SimpleText :='';
    messagebox(handle,'传输完成!','提示',mb_ok);
    progressbar.Position :=0;
    end;procedure TfrmMain.FormCreate(Sender: TObject);
    var
    aWSAData:TWSAData;
    begin
    if WSAStartup($0101,aWSAData)<>0 then
    raise Exception.Create('不能启动WinSock动态链接库');
    messageBox(Handle,aWSAdata.szDescription ,'WinSock动态链接库版本',mb_ok);
    end;
    procedure TfrmMain.btnExitClick(Sender: TObject);
    begin
    Close;
    end;
    procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
    if InTrans then
    if MessageBox(handle,'正在传输文件,停止吗?','提示',MB_YESNO)=IDNO then
    abort;
    //释放winsock动态链接库所创建的资源
    if WSACleanup<>0 then
    messagebox(handle,'清除Winsock动态链接库错误!','提示',MB_OK)
    ELSE
    messagebox(handle,'清除Winsock动态链接库成功!','提示',MB_OK);
    CloseSocket(Client);
    end;
    procedure TfrmMain.btnConnectClick(Sender: TObject);
    var
    ca:SOCKADDR_IN;
    hostaddr:u_long;
    begin
    Client:=Socket(PF_INET,SOCK_STREAM,IPPROTO_IP);
    IF CLIENT=INVALID_SOCKET THEN
    BEGIN
    StatusBar.SimpleText :='为连接远程服务器端创建COSKET错误!';
    exit;
    end;
    ca.sin_family :=PF_INET;
    CA.sin_port :=HTONS(STRTOINT(TRIM(EDTpORT.Text )));
    HOSTADDR:=INET_ADDR(PCHAR(TRIM(EDTIP.Text )));
    //判断IP是否合法
    if (hostaddr= -1) then
    begin
    StatusBar.SimpleText :='主机IP地址:'+trim(edtip.Text )+'错误';
    exit;
    end
    else
    ca.sin_addr.S_addr :=hostaddr;
    //连接服务器
    if connect(Client,ca,sizeof(ca))<>0 then
    begin
    StatusBar.SimpleText :='连接服务器端SOCKET错误!';
    exit;
    end
    else
    StatusBar.SimpleText :='连接远程SOCKET成功!';
    end;
    procedure TfrmMain.btnSendClick(Sender: TObject);
    begin
    if (opendfile.Execute ) and (FileExists(opendfile.FileName )) then
    transFile(opendfile.FileName );
    end;
    procedure TfrmMain.btnStopClick(Sender: TObject);
    begin
    Stoptrans:=True;
    end;
    end.