AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Patcher

Ein Thema von CallOfUnite · begonnen am 13. Jun 2012 · letzter Beitrag vom 14. Jun 2012
 
Horst0815

Registriert seit: 23. Mai 2011
Ort: Görlitz
150 Beiträge
 
Delphi XE Starter
 
#9

AW: Patcher

  Alt 14. Jun 2012, 23:05
Delphi-Quellcode:
unit uUpdate;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, UrlMon, ActiveX, StdCtrls, ShellAPI, ComCtrls, WinINet;

type
  TfrmUpdate = class(TForm)
    btnUpdateCheck: TButton;
    MemoInfo: TMemo;
    Fortschritt: TProgressBar;
    procedure btnUpdateCheckClick(Sender: TObject);
    Function GetHTML(AUrl: string): string;
  private
    { Private-Deklarationen }
  public
    { Pu
      blic-Deklarationen }

  end;

type
  cDownloadStatusCallback = class(TObject, IUnknown, IBindStatusCallback)
  private
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
    function OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall;
    function GetPriority(out nPriority): HResult; stdcall;
    function OnLowResource(reserved: DWORD): HResult; stdcall;
    function OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG;
      szStatusText: LPCWSTR): HResult; stdcall;
    function OnStopBinding(HResult: HResult; szError: LPCWSTR)
      : HResult; stdcall;
    function GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo)
      : HResult; stdcall;
    function OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD;
      formatetc: PFormatEtc; stgmed: PStgMedium): HResult; stdcall;
    function OnObjectAvailable(const IID: TGUID; punk: IUnknown)
      : HResult; stdcall;
  end;

var
  frmUpdate: TfrmUpdate;
  actual_version, last_version, waiting: string;
  cDownStatus: cDownloadStatusCallback;
  Datei, Ziel: PChar;
  rounds: Integer;
  usercancel: Boolean = False;

implementation

{$R *.dfm}

procedure TfrmUpdate.btnUpdateCheckClick(Sender: TObject);
begin
  if btnUpdateCheck.Tag = 1 then
  begin
    waiting := '';
    rounds := 0;
    sleep(10);
    MemoInfo.clear;
    application.ProcessMessages;
    cDownStatus := cDownloadStatusCallback.Create;
    try
      Datei := 'http://www.DeineHP.de/Setup.exe';
      Ziel := 'Setup.exe';
      UrlDownloadToFile(nil, Datei, Ziel, 0, cDownStatus);
      if MessageBox(0, 'DOWNLOAD COMPLETE, RESTART', 'Info',
        MB_OKCANCEL) = IDOK then
      Begin
        ShellExecute(application.Handle, 'open', PChar('Setup.exe'), nil,
          nil, SW_ShowNormal);
        application.terminate;
      End
      else
      begin
        btnUpdateCheck.Caption := 'Please install Update';
        btnUpdateCheck.Enabled := False;
        Exit;
      end;
    except
      showmessage('Download aborted!');
    end;
  end;
  if btnUpdateCheck.Tag = 0 then
  begin
    MemoInfo.clear;
    last_version := GetHTML('http://www.DeineHP.de/version.txt');
    if actual_version <> last_version then
    begin
      MemoInfo.lines.add('NEW UPDATE AVAILABLE! ' + last_version);
      MemoInfo.lines.add
        ('PRESS "DOWNLOAD NEW UPDATE NOW!" Button to get newest update!');
      btnUpdateCheck.Tag := 1;
      btnUpdateCheck.Caption := 'DOWNLOAD NEW UPDATE NOW!';
      btnUpdateCheck.font.size := 18;
      btnUpdateCheck.font.style := [fsBold];
    end
    else
    begin
      MemoInfo.lines.add('YOU USE THE LATEST AVAILABLE VERSION');
      MemoInfo.lines.add(GetHTML('http://www.DeineHP.de/news.txt'));
      MemoInfo.Perform(WM_VSCROLL, SB_TOP, 0);
    end;
  end;
end;

function cDownloadStatusCallback._AddRef: Integer;
begin
  Result := 0;
end;

function cDownloadStatusCallback._Release: Integer;
begin
  Result := 0;
end;

function cDownloadStatusCallback.QueryInterface(const IID: TGUID;
  out Obj): HResult;
begin
  if (GetInterface(IID, Obj)) then
  begin
    Result := 0
  end
  else
  begin
    Result := E_NOINTERFACE;
  end;
end;

function cDownloadStatusCallback.OnStartBinding(dwReserved: DWORD;
  pib: IBinding): HResult;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.GetPriority(out nPriority): HResult;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.OnLowResource(reserved: DWORD): HResult;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.OnStopBinding(HResult: HResult;
  szError: LPCWSTR): HResult; stdcall;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.GetBindInfo(out grfBINDF: DWORD;
  var bindinfo: TBindInfo): HResult; stdcall;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD;
  formatetc: PFormatEtc; stgmed: PStgMedium): HResult;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.OnObjectAvailable(const IID: TGUID;
  punk: IUnknown): HResult; stdcall;
begin
  Result := S_OK;
end;

function cDownloadStatusCallback.OnProgress(ulProgress, ulProgressMax,
  ulStatusCode: ULONG; szStatusText: LPCWSTR): HResult;
begin

  case ulStatusCode of
    BINDSTATUS_FINDINGRESOURCE:
      begin
        frmUpdate.MemoInfo.lines.add('File found on server.');
        if (usercancel) then
        begin
          Result := E_ABORT;
          Exit;
        end;
      end;
    BINDSTATUS_CONNECTING:
      begin
        frmUpdate.MemoInfo.lines.add('Connecting to Server..');
        if (usercancel) then
        begin
          Result := E_ABORT;
          Exit;
        end;
      end;
    BINDSTATUS_BEGINDOWNLOADDATA:
      begin
        frmUpdate.Fortschritt.Position := 0;
        frmUpdate.MemoInfo.lines.add('Start Downloading...');
        if (usercancel) then
        begin
          Result := E_ABORT;
          Exit;
        end;
      end;
    BINDSTATUS_DOWNLOADINGDATA:
      begin
        frmUpdate.Fortschritt.Position :=
          MulDiv(ulProgress, 100, ulProgressMax);
        // Form1.memo2.lines.add('Downloading.. PLEASE WAIT');

        rounds := rounds + 1;
        // if rounds = 50 then
        // begin
        // rounds := 0;
        // frmUpdate.MemoInfo.lines.Delete(frmUpdate.MemoInfo.lines.Count - 1);
        // waiting := waiting + '.';
        // frmUpdate.MemoInfo.lines.add('Downloading new Update' + waiting);
        // end;

        if (usercancel) then
        begin
          Result := E_ABORT;
          Exit;
        end;
      end;
    BINDSTATUS_ENDDOWNLOADDATA:
      begin
        frmUpdate.MemoInfo.lines.add('DOWNLOAD FINISHED!');
      end;
  end;
  Result := S_OK;
end;

Function TfrmUpdate.GetHTML(AUrl: string): string;
var
  databuffer: array [0 .. 4095] of char;
  ResStr: string;
  hSession, hfile: hInternet;
  dwindex, dwcodelen, dwread, dwNumber: cardinal;
  dwcode: array [1 .. 20] of char;
  res: PChar;
  Str: PChar;
begin
  ResStr := '';
  Result := '';
  if pos('http://', lowercase(AUrl)) = 0 then
    AUrl := 'http://' + AUrl;
  hSession := InternetOpen('InetURL:/1.0', INTERNET_OPEN_TYPE_PRECONFIG,
    nil, nil, 0);
  If assigned(hSession) Then
    Try
      hfile := InternetOpenUrl(hSession, PChar(AUrl), nil, 0,
        INTERNET_FLAG_RELOAD, 0);
      if assigned(hfile) then
        Try
          dwindex := 0;
          dwcodelen := 10;
          HttpQueryInfo(hfile, HTTP_QUERY_STATUS_CODE, @dwcode,
            dwcodelen, dwindex);
          res := PChar(@dwcode);
          dwNumber := sizeof(databuffer) - 1;
          if (res = '200') or (res = '302') then
          begin
            while (InternetReadfile(hfile, @databuffer, dwNumber, dwread)) AND
              (dwread <> 0) do
            begin
              databuffer[dwread] := #0;
              Str := PChar(@databuffer);
              ResStr := ResStr + Str;
            end;
          end
          else
            ResStr := 'Status:' + res;
        Finally
          InternetCloseHandle(hfile);
        End;
    Finally
      InternetCloseHandle(hSession);
    End;
  Result := ResStr;
end;

end.
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:06 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz