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
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von CallOfUnite
CallOfUnite

Registriert seit: 30. Jan 2012
Ort: Welt, bevorzugt Pokemon Island wie mein Vater zu sagen pflegte
33 Beiträge
 
Delphi 2005 Personal
 
#1

Patcher

  Alt 13. Jun 2012, 12:33
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
Delphi ist...

...na Programmieren, was dachtest du denn?
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#2

AW: Patcher

  Alt 13. Jun 2012, 12:35
Zitat:
Jetzt wollte ich mal wissen ob man einen Auto patcher einbauen kann
Ja, kann man...wenn man ihn programmiert

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

Geändert von blackfin (13. Jun 2012 um 12:45 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von BeBored
BeBored

Registriert seit: 2. Jun 2004
Ort: Cremlingen
90 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Patcher

  Alt 13. Jun 2012, 14:13
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
Matthias
Wer nichts wagt der nichts verliert.
  Mit Zitat antworten Zitat
Benutzerbild von CallOfUnite
CallOfUnite

Registriert seit: 30. Jan 2012
Ort: Welt, bevorzugt Pokemon Island wie mein Vater zu sagen pflegte
33 Beiträge
 
Delphi 2005 Personal
 
#4

AW: Patcher

  Alt 14. Jun 2012, 16:40
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 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
Delphi ist...

...na Programmieren, was dachtest du denn?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#5

AW: Patcher

  Alt 14. Jun 2012, 16:43
Sonst schau Dich doch mal bei Torry um.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von CallOfUnite
CallOfUnite

Registriert seit: 30. Jan 2012
Ort: Welt, bevorzugt Pokemon Island wie mein Vater zu sagen pflegte
33 Beiträge
 
Delphi 2005 Personal
 
#6

AW: Patcher

  Alt 14. Jun 2012, 16:43
Zitat:
Jetzt wollte ich mal wissen ob man einen Auto patcher einbauen kann
Ja, kann man...wenn man ihn programmiert

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
Delphi ist...

...na Programmieren, was dachtest du denn?
  Mit Zitat antworten Zitat
Benutzerbild von CallOfUnite
CallOfUnite

Registriert seit: 30. Jan 2012
Ort: Welt, bevorzugt Pokemon Island wie mein Vater zu sagen pflegte
33 Beiträge
 
Delphi 2005 Personal
 
#7

AW: Patcher

  Alt 14. Jun 2012, 16:46
Sonst schau Dich doch mal bei Torry um.
cool danke jetzt meine frage: darf ich das gewerblich nutzen? eher nicht oder?
Delphi ist...

...na Programmieren, was dachtest du denn?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#8

AW: Patcher

  Alt 14. Jun 2012, 16:48
Das sollte in den Lizenzbedingungen der Komponente Deiner Wahl stehen, es werden ja mehrere gefunden.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#9

AW: Patcher

  Alt 14. Jun 2012, 17:10
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
Andreas
  Mit Zitat antworten Zitat
Horst0815

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

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
Antwort Antwort
Seite 1 von 2  1 2      


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 02:28 Uhr.
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