⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.pas

📁 一个基于Socket的在线更新程序
💻 PAS
字号:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, hxUpdate, hxFileRes, ComCtrls, Grids, ValEdit,
  ExtCtrls;

type
  TInit = function(ProjectName: PChar; Host: PChar; Port: Integer;
    ASocksInfo: PSocksInfo = nil): Boolean; stdcall;
  TCheckVersion = function: Boolean; stdcall;
  TUpdateProduct = function(DownloadProgress: TDownloadProgress): Boolean; stdcall;
  TGetVersions = function(VerInfo: PVerInfo; Index: Integer): Integer; stdcall;

  TMainForm = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    pbDownload: TProgressBar;
    lblDownload: TLabel;
    chkProxy: TCheckBox;
    Label1: TLabel;
    edtProxyIP: TEdit;
    edtProxyPort: TEdit;
    Label2: TLabel;
    edtUsername: TEdit;
    Label3: TLabel;
    edtPassword: TEdit;
    Label4: TLabel;
    Button5: TButton;
    vlVersions: TValueListEditor;
    Notebook1: TNotebook;
    Edit1: TEdit;
    Button6: TButton;
    Label5: TLabel;
    Label6: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
  private
    { Private declarations }
    LibHandle: THandle;
  public
    { Public declarations }
  end;

var
  MainForm: TMainForm;

implementation

{$R *.dfm}

procedure DoDownloadProgress(DownloadStatus: TDownloadStatus; FileName: string;
  WorkCount: Integer);
begin
  with MainForm do
  begin
    case DownloadStatus of
      dsBegin:
      begin
        pbDownload.Min:= 0;
        pbDownload.Max:= WorkCount;
        pbDownload.Step:= 1;
        pbDownload.Position:= 0;
      end;
      dsFileBegin:
        lblDownload.Caption:= Format('正在下载%s....', [FileName]);
      dsFileData:
      begin
        pbDownload.StepBy(WorkCount);
      end;
      dsFileEnd:
      begin
        lblDownload.Caption:= '下载完毕!';
        //ShowMessage('Download ok.');
      end;
      dsEnd:
      begin
        //所有文件下载完毕
        lblDownload.Caption:= '所有文件已经下载完毕.';
        Notebook1.PageIndex:= 1;
      end;
    end;
  end;
end;

procedure TMainForm.Button1Click(Sender: TObject);
var
  CheckVersion: TCheckVersion;
begin
  @CheckVersion:= GetProcAddress(LibHandle, 'CheckNewVersion');
  if (@CheckVersion <> nil) then
  begin
    if CheckVersion then
      ShowMessage('找到新版本了!')
    else
      ShowMessage('当前版本已经是最新的了!');
  end
  else
    RaiseLastWin32Error;
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
  LibHandle:= LoadLibrary('..\LiveUpdate.dll');
  if LibHandle = 0 then
      raise Exception.CreateFmt('无法加载动态链接库LiveUpdate.dll,错误码是%d', [GetLastError]);
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  if LibHandle <> 0 then
    FreeLibrary(LibHandle);
end;

procedure TMainForm.Button2Click(Sender: TObject);
var
  UpdateProduct: TUpdateProduct;
begin
  @UpdateProduct:= GetProcAddress(LibHandle, 'UpdateProduct');
  if @UpdateProduct <> nil then
    if not UpdateProduct(DoDownloadProgress) then
      Exit;
end;

procedure TMainForm.Button3Click(Sender: TObject);
var
  SocksInfo: PSocksInfo;
  Init: TInit;
  Ret: Boolean;
begin
  @Init:= GetProcAddress(LibHandle, 'Init');
  if @Init = nil then
    raise Exception.Create('无法找到Dll函数!');
  if not chkProxy.Checked then
    Ret:= Init('音乐天堂', '10.1.1.139', 9901)
  else
  begin
    New(SocksInfo);
    with SocksInfo^ do
    begin
      ProxyIP:= '10.1.1.254';
      ProxyPort:= 1080;
      ProxyUser:= '';
      ProxyPass:= '';
    end;
    edtProxyIP.Text:= SocksInfo^.ProxyIP;
    edtUsername.Text:= SocksInfo^.ProxyUser;
    edtProxyPort.Text:= IntToStr(SocksInfo^.ProxyPort);
    edtPassword.Text:= SocksInfo^.ProxyPass;
    Ret:= Init('音乐天堂', '61.141.158.133', 9901, SocksInfo);
    Dispose(SocksInfo);
  end;
  if Ret then
    ShowMessage('初始化成功.')
  else
    ShowMessage('初始化失败!');
end;

procedure TMainForm.Button4Click(Sender: TObject);
var
  I, Count: Integer;
  pInfo: PVerInfo;
  GetOldVersions: TGetVersions;
begin
  @GetOldVersions:= GetProcAddress(LibHandle, 'GetOldVersions');
  if @GetOldVersions <> nil then
  begin
    Count:= GetOldVersions(nil, 0);
    New(pInfo);
    with pInfo^ do
    begin
      FileName:= AllocMem(256);
      Version:= AllocMem(256);
    end;
    for I:= 0 to Count - 1 do
    begin
      GetOldVersions(pInfo, I);
      vlVersions.Values[pInfo^.FileName]:= pInfo^.Version;
    end;
    with pInfo^ do
    begin
      FreeMem(FileName, 256);
      FreeMem(Version, 256);
    end;
    Dispose(pInfo);
  end;
end;

procedure TMainForm.Button5Click(Sender: TObject);
var
  I, Count: Integer;
  pInfo: PVerInfo;
  GetNewVersions: TGetVersions;
begin
  @GetNewVersions:= GetProcAddress(LibHandle, 'GetNewVersions');
  if @GetNewVersions <> nil then
  begin
    Count:= GetNewVersions(nil, 0);
    New(pInfo);
    New(pInfo);
    with pInfo^ do
    begin
      FileName:= AllocMem(256);
      Version:= AllocMem(256);
    end;
    for I:= 0 to Count - 1 do
    begin
      GetNewVersions(pInfo, I);
      vlVersions.Values[pInfo^.FileName]:= pInfo^.Version;
    end;
    with pInfo^ do
    begin
      FreeMem(FileName, 256);
      FreeMem(Version, 256);
    end;
    Dispose(pInfo);
  end;
end;
end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -