frmMain.pas
上传用户:youjie821
上传日期:2013-01-27
资源大小:459k
文件大小:10k
源码类别:

PlugIns编程

开发平台:

Delphi

  1. unit frmMain;
  2. interface
  3. uses
  4.   Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5.   Dialogs, Menus, ActnList, ComCtrls, RzListVw, RzTreeVw, RzPrgres, IniFiles,
  6.   StdCtrls, RzLstBox, RzLabel, ExtCtrls, GIFImage, RzButton, RzPanel, hxConst,
  7.   ShellApi, RzRadChk;
  8. const
  9.   CM_FINISHUPDATE = WM_USER + 1;
  10. type
  11.   TMainForm = class(TForm)
  12.     RzPanel1: TRzPanel;
  13.     RzButton2: TRzButton;
  14.     RzButton3: TRzButton;
  15.     RzButton4: TRzButton;
  16.     RzPanel2: TRzPanel;
  17.     RzPanel3: TRzPanel;
  18.     Image1: TImage;
  19.     Notebook1: TNotebook;
  20.     RzPanel5: TRzPanel;
  21.     RzLabel9: TRzLabel;
  22.     RzLabel10: TRzLabel;
  23.     pbFileList: TRzProgressBar;
  24.     lblDownloadFileList: TRzLabel;
  25.     RzPanel6: TRzPanel;
  26.     RzLabel1: TRzLabel;
  27.     pbTotalDownload: TRzProgressBar;
  28.     lblDownloadFileName: TRzLabel;
  29.     pbFileDownload: TRzProgressBar;
  30.     RzLabel12: TRzLabel;
  31.     RzLabel2: TRzLabel;
  32.     lvUpdateFiles: TRzListView;
  33.     RzPanel7: TRzPanel;
  34.     RzLabel3: TRzLabel;
  35.     RzLabel8: TRzLabel;
  36.     Label1: TRzLabel;
  37.     ActionList1: TActionList;
  38.     actOpen: TAction;
  39.     actClose: TAction;
  40.     actDownloadFileList: TAction;
  41.     actDowloadSelectedFiles: TAction;
  42.     actDownloadNewFiles: TAction;
  43.     actBack: TAction;
  44.     actNext: TAction;
  45.     actCancel: TAction;
  46.     actFinish: TAction;
  47.     actConfig: TAction;
  48.     actViewFileInfo: TAction;
  49.     PopupMenu1: TPopupMenu;
  50.     N1: TMenuItem;
  51.     RzPanel4: TRzPanel;
  52.     RzLabel4: TRzLabel;
  53.     RzLabel5: TRzLabel;
  54.     RzLabel6: TRzLabel;
  55.     RzLabel7: TRzLabel;
  56.     RzButton1: TRzButton;
  57.     lvOldVersions: TRzListView;
  58.     lvNewVersions: TRzListView;
  59.     chkRunExe: TRzCheckBox;
  60.     procedure FormCreate(Sender: TObject);
  61.     procedure FormDestroy(Sender: TObject);
  62.     procedure actBackExecute(Sender: TObject);
  63.     procedure actBackUpdate(Sender: TObject);
  64.     procedure actNextExecute(Sender: TObject);
  65.     procedure actNextUpdate(Sender: TObject);
  66.     procedure actCancelExecute(Sender: TObject);
  67.     procedure actCancelUpdate(Sender: TObject);
  68.     procedure actFinishExecute(Sender: TObject);
  69.     procedure actFinishUpdate(Sender: TObject);
  70.     procedure actConfigExecute(Sender: TObject);
  71.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  72.   private
  73.     { Private declarations }
  74.     FLibHandle: THandle;
  75.   protected
  76.     procedure FinishUpdate(var Msg: TMessage); message CM_FINISHUPDATE;
  77.   public
  78.     { Public declarations }
  79.   end;
  80.   PVerInfo = ^TVerInfo;
  81.   TVerInfo = record
  82.     FileName: PChar;
  83.     Version: PChar;
  84.   end;
  85.   TInitDll = function(ProjectName: PChar; Host: PChar; Port: Integer;
  86.     ASocksInfo: PSocksInfo = nil): Boolean; stdcall;
  87.   TCheckVersion = function: Boolean; stdcall;
  88.   TUpdateProduct = function(DownloadProgress: TDownloadProgress): Boolean; stdcall;
  89.   TGetVersions = function(VerInfo: PVerInfo; Index: Integer): Integer; stdcall;
  90.   procedure DoDownloadProgress(DownloadStatus: TDownloadStatus; FileName: string;
  91.     WorkCount: Integer);
  92. var
  93.   MainForm: TMainForm;
  94. implementation
  95. uses
  96.   frmConfig;
  97. {$R *.dfm}
  98. procedure DoDownloadProgress(DownloadStatus: TDownloadStatus; FileName: string;
  99.   WorkCount: Integer);
  100. begin
  101.    with MainForm do
  102.   begin
  103.     case DownloadStatus of
  104.       dsBegin:
  105.       begin
  106.         pbTotalDownload.TotalParts:= WorkCount;
  107.         pbTotalDownload.Percent:= 0;
  108.       end;
  109.       dsFileBegin:
  110.       begin
  111.         lblDownloadFileName.Caption:= Format('正在下载%s....', [FileName]);
  112.         pbFileDownload.TotalParts:= WorkCount;
  113.         pbFileDownload.Percent:= 0;
  114.       end;
  115.       dsFileData:
  116.       begin
  117.         pbFileDownload.IncParts(WorkCount);
  118.         pbTotalDownload.IncParts(WorkCount);
  119.       end;
  120.       dsFileEnd:
  121.       begin
  122.         //ShowMessage('Download ok.');
  123.         lblDownloadFileName.Caption:= '下载完毕!';
  124.       end;
  125.       dsEnd:
  126.       begin
  127.         //所有文件下载完毕
  128.         lblDownloadFileName.Caption:= '所有文件已经下载完毕.';
  129.         //Notebook1.PageIndex:= Notebook1.Pages.Count - 1;
  130.         PostMessage(Handle, CM_FINISHUPDATE, 0, 0);
  131.       end;
  132.     end;
  133.   end;
  134. end;
  135. procedure TMainForm.FormCreate(Sender: TObject);
  136. var
  137.   Ini: TIniFile;
  138.   I, C: Integer;
  139.   VerInfo: PVerInfo;
  140.   SocksInfo: PSocksInfo;
  141.   AProxyIP, AUsername, APassword: string;
  142.   AProxyPort: Integer;
  143.   InitDll: TInitDll;
  144.   GetOldVersions: TGetVersions;
  145. begin
  146.   if ParamCount < 1 then
  147.     chkRunExe.Visible:= False;
  148.   FLibHandle:= LoadLibrary('LiveUpdate.dll');
  149.   if FLibHandle = 0 then
  150.     raise Exception.Create('无法加载LiveUpdate.dll文件!');
  151.   @InitDll:= GetProcAddress(FLibHandle, 'Init');
  152.   if @InitDll = nil then
  153.     raise Exception.Create('无法找到Dll入口函数Init!');
  154.   with GetApp.Settings.ConnectInfo, GetApp.Settings.LiveUpdateInfo do
  155.   begin
  156.     case ConnectType of
  157.       ctDirect, ctNat:
  158.       begin
  159.         if not InitDll(PChar(Project), PChar(ServerIP), ServerPort) then
  160.           Close;
  161.       end;
  162.       ctProxy:
  163.       begin
  164.         AProxyIP:= ProxyIP;
  165.         AProxyPort:= ProxyPort;
  166.         AUsername:= ProxyUser;
  167.         APassword:= ProxyPass;
  168.         New(SocksInfo);
  169.         with SocksInfo^ do
  170.         begin
  171.           ProxyIP:= AllocMem(256);
  172.           ProxyUser:= AllocMem(256);
  173.           ProxyPass:= AllocMem(256);
  174.         end;
  175.         try
  176.           with SocksInfo^ do
  177.           begin
  178.             StrPCopy(ProxyIP, AProxyIP);
  179.             ProxyPort:= AProxyPort;
  180.             StrPCopy(ProxyUser, AUsername);
  181.             StrPCopy(ProxyPass, APassword);
  182.           end;
  183.           if not InitDll(PChar(Project), PChar(ServerIP), ServerPort, SocksInfo) then
  184.             Close;
  185.         finally
  186.           with SocksInfo^ do
  187.           begin
  188.             FreeMem(ProxyIP, 256);
  189.             FreeMem(ProxyUser, 256);
  190.             FreeMem(ProxyPass, 256);
  191.           end;
  192.           Dispose(SocksInfo);
  193.         end;
  194.       end;
  195.     end;
  196.   end;
  197.   //显示已安装的文件信息
  198.   New(VerInfo);
  199.   with VerInfo^ do
  200.   begin
  201.     FileName:= AllocMem(256);
  202.     Version:= AllocMem(256);
  203.   end;
  204.   @GetOldVersions:= GetProcAddress(FLibHandle, 'GetOldVersions');
  205.   if @GetOldVersions = nil then
  206.     raise Exception.Create('无法找到Dll入口函数GetOldVersions');
  207.   C:= GetOldVersions(nil, 0);
  208.   for I:= 0 to C - 1 do
  209.   begin
  210.     with lvOldVersions.Items.Add do
  211.     begin
  212.       Caption:= VerInfo^.FileName;
  213.       SubItems.Add(VerInfo^.Version);
  214.     end;
  215.   end;
  216.   with VerInfo^ do
  217.   begin
  218.     FreeMem(FileName, 256);
  219.     FreeMem(Version, 256);
  220.   end;
  221.   Dispose(VerInfo);
  222.   Notebook1.PageIndex:= 0;
  223. end;
  224. procedure TMainForm.actBackExecute(Sender: TObject);
  225. begin
  226.   Notebook1.PageIndex:= Notebook1.PageIndex - 1;
  227. end;
  228. procedure TMainForm.actBackUpdate(Sender: TObject);
  229. begin
  230.   (Sender as TAction).Enabled:= (Notebook1.PageIndex > 0) and
  231.     (Notebook1.PageIndex <> Notebook1.Pages.Count - 1) and
  232.     ((Sender as TAction).Tag = 0);
  233. end;
  234. procedure TMainForm.actNextExecute(Sender: TObject);
  235. var
  236.   I, C: Integer;
  237.   VerInfo: PVerInfo;
  238.   slFiles: TStrings;
  239.   FileSize: Integer;
  240.   CheckNewVersion: TCheckVersion;
  241.   GetNewVersions: TGetVersions;
  242.   UpdateProduct: TUpdateProduct;
  243. begin
  244.   Notebook1.PageIndex:= Notebook1.PageIndex + 1;
  245.   case Notebook1.PageIndex of
  246.     1:  // download file list
  247.     begin
  248.       @CheckNewVersion:= GetProcAddress(FLibHandle, 'CheckNewVersion');
  249.       if @CheckNewVersion = nil then
  250.         raise Exception.Create('无法找到Dll入口函数CheckNewVersion!');
  251.       if CheckNewVersion then
  252.       begin
  253.         //找到新版本,显示文件版本信息
  254.         New(VerInfo);
  255.         with VerInfo^ do
  256.         begin
  257.           FileName:= AllocMem(256);
  258.           Version:= AllocMem(256);
  259.         end;
  260.         @GetNewVersions:= GetProcAddress(FLibHandle, 'GetNewVersions');
  261.         if @GetNewVersions = nil then
  262.           raise Exception.Create('无法找到Dll入口函数GetNewVersions!');
  263.         C:= GetNewVersions(nil, 0);
  264.         for I:= 0 to C - 1 do
  265.         begin
  266.           GetNewVersions(VerInfo, I);
  267.           with lvNewVersions.Items.Add do
  268.           begin
  269.             Caption:= VerInfo^.FileName;
  270.             SubItems.Add(VerInfo^.Version);
  271.             Checked:= True;
  272.           end;
  273.         end;
  274.         with VerInfo^ do
  275.         begin
  276.           FreeMem(FileName, 256);
  277.           FreeMem(Version, 256);
  278.         end;
  279.         Dispose(VerInfo);
  280.       end
  281.       else
  282.       begin
  283.         //Notebook1.PageIndex:= Notebook1.Pages.Count - 1;
  284.         PostMessage(Handle, CM_FINISHUPDATE, 0, 0);
  285.       end;
  286.     end;
  287.     2: // download files
  288.     begin
  289.       @UpdateProduct:= GetProcAddress(FLibHandle, 'UpdateProduct');
  290.       if @UpdateProduct = nil then
  291.         raise Exception.Create('无法找到Dll入口函数UpdateProduct!');
  292.         
  293.       UpdateProduct(DoDownloadProgress);
  294.     end;
  295.   end;
  296. end;
  297. procedure TMainForm.actNextUpdate(Sender: TObject);
  298. begin
  299.   (Sender as TAction).Enabled:= Notebook1.PageIndex < Notebook1.Pages.Count - 1;
  300. end;
  301. procedure TMainForm.actCancelExecute(Sender: TObject);
  302. begin
  303.   Close;
  304. end;
  305. procedure TMainForm.actCancelUpdate(Sender: TObject);
  306. begin
  307.   if Notebook1.PageIndex = Notebook1.Pages.Count - 1 then
  308.     (Sender as TAction).Caption:= '关闭'
  309.   else
  310.     (Sender as TAction).Caption:= '取消';
  311. end;
  312. procedure TMainForm.actFinishExecute(Sender: TObject);
  313. begin
  314.   Close;
  315. end;
  316. procedure TMainForm.actFinishUpdate(Sender: TObject);
  317. begin
  318.   (Sender as TAction).Enabled:= Notebook1.PageIndex = Notebook1.Pages.Count - 1;
  319. end;
  320. procedure TMainForm.actConfigExecute(Sender: TObject);
  321. begin
  322.   // 配置网络
  323.   ShowConfigForm
  324. end;
  325. procedure TMainForm.FormDestroy(Sender: TObject);
  326. begin
  327.   if FLibHandle <> 0 then
  328.     FreeLibrary(FLibHandle);
  329.   GetApp.Free;
  330. end;
  331. procedure TMainForm.FinishUpdate(var Msg: TMessage);
  332. begin
  333.   Notebook1.PageIndex:= Notebook1.Pages.Count - 1;
  334. end;
  335. procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction);
  336. begin
  337.   if (chkRunExe.Visible) and (chkRunExe.Checked) then
  338.     ShellExecute(0, 'open', PChar(ParamStr(1)), '', '', SW_NORMAL);
  339. end;
  340. end.