Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Patcher (https://www.delphipraxis.net/168834-patcher.html)

CallOfUnite 13. Jun 2012 11:33

Patcher
 
Jo ich arbeite gerade an einem kleinen Progrämmchen...
Jetzt wollte ich mal wissen ob man einen Auto patcher einbauen kann
Dieser soll meinen Server kontaktieren und schauen
Ob es eine neue Version des
Programms gibt, und wenn soll er halt die exe Austauschen


Danke MfG CallOfUnite

blackfin 13. Jun 2012 11:35

AW: Patcher
 
Zitat:

Jetzt wollte ich mal wissen ob man einen Auto patcher einbauen kann
Ja, kann man...wenn man ihn programmiert :-D

Server-Abfrage z.B. über HTTP (Indy-Komponenten oder Overbyte ICS oder Raw Socket oder...was dir am Liebsten ist) :-)
Serverseitig brauchst du natürlich dann auch einen Webservice oder eine API, die deine Anfrage entgegennimmt, nachguckt ob es eine neue Version gibt und das Resultat (download-url etc.) zurücksendet.
Hast du einen Windows-Server, kannst du auch das wahrscheinlich in Delphi schreiben, ansonsten, auf einem herkömmlichen Linux-Server geht natürlich auch eine Scriptsprache wie php, Ruby etc. für die Implementation des Webservice / der API.

Ablauf wäre dann z.B. folgender andenkbar:
Dein Patcher liest aus der EXE die Versionsnummer, sendet sie an den Server, der schaut nach, ob es eine neue Version gibt.
Gibt es keine, schickt er einen Statuscode zurück, der "kein Update nötig" aussagt.
Gibt es jedoch ein Update, schickt er einen anderen Statuscode, zusammen mit der Download-URL der neuen Version.
Der Patcher lädt sich diese Datei herunter und patcht dann die aktuelle Version oder führt die heruntergeladene Version aus, je nachdem wie du patchen willst.

P.S.
AFAIK gibt es inzwischen sogar schon fertige "Download&Patch"-Komponenten für Delphi...wenn mich nicht alles täuscht, z.B. von TMS

BeBored 13. Jun 2012 13:13

AW: Patcher
 
Zitat:

Zitat von blackfin (Beitrag 1170633)
AFAIK gibt es inzwischen sogar schon fertige "Download&Patch"-Komponenten für Delphi...wenn mich nicht alles täuscht, z.B. von TMS

WebUpdate von TMS. Ist nicht einmal so teuer:
http://www.tmssoftware.com/site/wupdate.asp

CallOfUnite 14. Jun 2012 15:40

AW: Patcher
 
Zitat:

Zitat von BeBored (Beitrag 1170654)
Zitat:

Zitat von blackfin (Beitrag 1170633)
AFAIK gibt es inzwischen sogar schon fertige "Download&Patch"-Komponenten für Delphi...wenn mich nicht alles täuscht, z.B. von TMS

WebUpdate von TMS. Ist nicht einmal so teuer:
http://www.tmssoftware.com/site/wupdate.asp

klar ich kann auch geld kacken wa :D ne dann schreib ich mir das lieber selber zusammen als da ne fuffi hinzulegen...
wenn ichs fertig habe lass ich euch das wissen, ich biete mein programm dann für 5 euro an, mach ich sicher mehr geld als die firma :D

DeddyH 14. Jun 2012 15:43

AW: Patcher
 
Sonst schau Dich doch mal bei Torry um.

CallOfUnite 14. Jun 2012 15:43

AW: Patcher
 
Zitat:

Zitat von blackfin (Beitrag 1170633)
Zitat:

Jetzt wollte ich mal wissen ob man einen Auto patcher einbauen kann
Ja, kann man...wenn man ihn programmiert :-D

Server-Abfrage z.B. über HTTP (Indy-Komponenten oder Overbyte ICS oder Raw Socket oder...was dir am Liebsten ist) :-)
Serverseitig brauchst du natürlich dann auch einen Webservice oder eine API, die deine Anfrage entgegennimmt, nachguckt ob es eine neue Version gibt und das Resultat (download-url etc.) zurücksendet.
Hast du einen Windows-Server, kannst du auch das wahrscheinlich in Delphi schreiben, ansonsten, auf einem herkömmlichen Linux-Server geht natürlich auch eine Scriptsprache wie php, Ruby etc. für die Implementation des Webservice / der API.

Ablauf wäre dann z.B. folgender andenkbar:
Dein Patcher liest aus der EXE die Versionsnummer, sendet sie an den Server, der schaut nach, ob es eine neue Version gibt.
Gibt es keine, schickt er einen Statuscode zurück, der "kein Update nötig" aussagt.
Gibt es jedoch ein Update, schickt er einen anderen Statuscode, zusammen mit der Download-URL der neuen Version.
Der Patcher lädt sich diese Datei herunter und patcht dann die aktuelle Version oder führt die heruntergeladene Version aus, je nachdem wie du patchen willst.

P.S.
AFAIK gibt es inzwischen sogar schon fertige "Download&Patch"-Komponenten für Delphi...wenn mich nicht alles täuscht, z.B. von TMS

ich würde das mit nem http über indy machen (wollen) könntest du da noch genauer drauf eingehen?
also nen server hab ich, ich bräcuhte also sozusagen meinen patcher der dem server übermittelt wie die exe heisst (in meinem fall ausreichend da im namen des programms die versionsnummer enthalten ist) das überprüft, und wenn der was runterladen müsste, wie kann ichdas machen, also ich hab sozusagen die neue exe aufn server, wie kann ich das 'runterladen' durch den patcher??
und wie kann ich das dann ersetzen lassen?

Danke :)

CallOfUnite 14. Jun 2012 15:46

AW: Patcher
 
Zitat:

Zitat von DeddyH (Beitrag 1170903)
Sonst schau Dich doch mal bei Torry um.

cool danke :-) jetzt meine frage: darf ich das gewerblich nutzen? eher nicht oder?

DeddyH 14. Jun 2012 15:48

AW: Patcher
 
Das sollte in den Lizenzbedingungen der Komponente Deiner Wahl stehen, es werden ja mehrere gefunden.

shmia 14. Jun 2012 16:10

AW: Patcher
 
Also, das Herunterladen von Dateien unter Windows ist total einfach (wenn man seine Ansprüche etwas zurückschraubt)
Delphi-Quellcode:
uses ... UrlMon;

function DownLoadInternetFile(const URL, DestinationFile : String): Boolean;
begin
   Result := URLDownloadToFile(nil,PChar(DestinationFile),PChar(Dest),0,nil) = 0
end;
Es gibt halt keinen Progressbar während des Downloads, aber das ist vorerst mal egal.
Später kann du das immer noch durch INDY, Synapse oder was auch immer ersetzen.

Der Rest ist reine Fleissarbeit.
* Webserver aufsetzen
* Steuerdatei (INI-File oder XML Datei) herunterladen
* Steuerdatei auswerten
* Benutzer ggf. fragen ob er das Update installieren will
* Kucken was noch heruntergeladen werden muss
* Nach dem Herunterladen aller notwendigen Dateien die Anwendung
auf der lokaler Platte updaten

Horst0815 14. Jun 2012 22:05

AW: Patcher
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:18 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz