Entwickler-Ecke

Internet / Netzwerk - Update eines Programmes via Internet


Highspeeder - Di 02.01.07 09:55
Titel: Update eines Programmes via Internet
Wie kann ich ein Programm übers Internet updaten ?

1. Abfragen, ob eine neue Version verfügbar ist
2. Programm beenden
3. altes Programm löschen
4. neues Programm über Internet laden
5. Programm wieder starten

hm....geht das überhaupt mit einem einzigen Programm ????


Leuchtturm - Di 02.01.07 09:59

Programm wieder starten kannst du mit shellexute


UGrohne - Di 02.01.07 10:04

user profile iconLeuchtturm hat folgendes geschrieben:
Programm wieder starten kannst du mit shellexute

Das wird ihm aber nichts bringen, wenn er die Exe erst updaten muss.

Sehr einfache Vorgehensweise: Textdatei auf Deinem Server im Internet mit der aktuellen Versionsnummer. Diese wird heruntergeladen und die Versionsnummer mit der lokalen verglichen. Wenn sie unterschiedlich sind, wird die Exe-Datei vom Server heruntergeladen. Dann erzeugst Du eine Batch-Datei, mit deren Hilfe die heruntergeladene Datei über die eigentliche Exe-Datei kopiert wird und die das Programm wieder startet, fertig.

Das Konzept lässt sich noch beliebig erweitern ;)


Leuchtturm - Di 02.01.07 10:05

user profile iconUGrohne hat folgendes geschrieben:
user profile iconLeuchtturm hat folgendes geschrieben:
Programm wieder starten kannst du mit shellexute

Das wird ihm aber nichts bringen, wenn er die Exe erst updaten muss.

Sehr einfache Vorgehensweise: Textdatei auf Deinem Server im Internet mit der aktuellen Versionsnummer. Diese wird heruntergeladen und die Versionsnummer mit der lokalen verglichen. Wenn sie unterschiedlich sind, wird die Exe-Datei vom Server heruntergeladen. Dann erzeugst Du eine Batch-Datei, mit deren Hilfe die heruntergeladene Datei über die eigentliche Exe-Datei kopiert wird und die das Programm wieder startet, fertig.

Das Konzept lässt sich noch beliebig erweitern ;)

Sorry ich hatte das falsch vestanden, ich dachte er will ein zweites Programm starten und mit diesem dann runterladen :oops:


Corpsman - Di 02.01.07 11:15

Hossa,

Wie Kriege ich denn mein Programm dazu das es die File XYZ vom server meiner HP lädt ?

bzw gibt es nicht irgend einen Trick das man die Datei ausliest ohne sie direkt laden zu müssen ?

Wenn die Anwendung keine Schreibrechte auf der platte hat wäre die Runterladenvariante ungeschickt ?


UGrohne - Di 02.01.07 11:27

user profile iconCorpsman hat folgendes geschrieben:
Wie Kriege ich denn mein Programm dazu das es die File XYZ vom server meiner HP lädt ?

Suche in der Entwickler-Ecke DATEI DOWNLOADEN
user profile iconCorpsman hat folgendes geschrieben:
bzw gibt es nicht irgend einen Trick das man die Datei ausliest ohne sie direkt laden zu müssen ?

Wie willst Du ein Brötchen essen ohne zum Bäcker zu gehen?
user profile iconCorpsman hat folgendes geschrieben:
Wenn die Anwendung keine Schreibrechte auf der platte hat wäre die Runterladenvariante ungeschickt ?

Dafür gibt es temporäre Verzeichnisse oder das Benutzerverzeichnis. Für das Update der Exe-Datei muss natürlich jemand angemeldet sein, der über entsprechende Rechte verfügt.


jaenicke - Di 02.01.07 11:28

Ohne Schreibrechte geht gar nix, selbst wenn die Exe sich selbst verändern könnte. Auch Verändern braucht Schreibrechte...


Andidreas - Di 02.01.07 12:58

Versuch es mal so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
procedure TfrmUpdate.btnDownloadClick(Sender: TObject);
var
  lStream: TFileStream;
  OldDir: String;
begin
  OldDir := GetCurrentDir();
  ChDir(ExtractFilePath(ParamStr(0)));
  if NOT FileExists('FileTransfer.old'then
    RenameFile('FileTransfer.exe''FileTransfer.old')
  else
  begin
    DeleteFile('FileTransfer.old');
    RenameFile('FileTransfer.exe''FileTransfer.old')
  end;
  Label6.Visible := true;
  ProgressBar1.Visible := true;
  lStream := TFileStream.Create('DATEINAME.exe', fmCreate or fmShareDenyNone);
  try
    idHTTP1.Get('http://DEINESEITE/DATEINAME.exe', lStream);
  finally
    lStream.Free;
  end;
  ShellExecute(Handle, 'open''DATEINAME.exe'nilnil, SW_SHOWNORMAL);
  ChDir(OldDir);
  Application.Terminate;
end;

procedure TfrmUpdate.FormShow(Sender: TObject);
var
  LatestVersion,
  CurrentVersion: String;
begin
  LatestVersion := IdHttp1.Get('http://DEINESEITE/version.txt');
  CurrentVersion := GetFileVersion(Application.ExeName);
  Label3.Caption := CurrentVersion;
  Label4.Caption := LatestVersion;
  while Pos('.', CurrentVersion) > 0 do
    Delete(CurrentVersion, 1, Pos('.', CurrentVersion));
  while Pos('.', LatestVersion) > 0 do
    Delete(LatestVersion, 1, Pos('.', LatestVersion));
  if LatestVersion > CurrentVersion then
  begin
    btnDownload.Visible := true;
    btnCancel.Visible := true;
    Label5.Caption := 'Programm wird anschließend beendet und neu gestartet.';
  end
  else
    btnOk.Visible := true;
end;


Nicht vergessen: IdHTTP einbinden. Versionsnummer so angeben, wie sie im Prg eingetragen ist.


Corpsman - Di 02.01.07 14:25

Wenn ich keine Schreibrechte habe kann ich immerhin prüfen ob die Aktuelel version online ist.

Ich habs nu so gemacht :

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
uses WinInet;
Function GetHTML(AUrl: String): String;
Var
  databuffer: Array[0..4095Of char;
  ResStr: String;
  hSession, hfile, hRequest: hInternet;
  dwindex, dwcodelen, datalen, dwread, dwNumber: cardinal;
  dwcode: Array[1..20Of char;
  res: pchar;
  Str: pchar;
Begin
  ResStr := '';
  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 Begin
    hfile := InternetOpenUrl(
      hsession,
      pchar(AUrl),
      Nil,
      0,
      INTERNET_FLAG_RELOAD,
      0);
    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)) Do Begin
        If dwRead = 0 Then
          break;
        databuffer[dwread] := #0;
        Str := pchar(@databuffer);
        resStr := resStr + Str;
      End;
    End
    Else
      ResStr := 'Status:' + res;
    If assigned(hfile) Then
      InternetCloseHandle(hfile);
  End;
  InternetCloseHandle(hsession);
  Result := resStr;
End;


das Klappt wunderbar.