Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fehler beim ausführen eine Update-Funktion (https://www.delphipraxis.net/167318-fehler-beim-ausfuehren-eine-update-funktion.html)

gelberkaktus 23. Mär 2012 16:04


Fehler beim ausführen eine Update-Funktion
 
Liste der Anhänge anzeigen (Anzahl: 1)
Wenn ich meine Anwendung ausführe erscheint immer folgende Fehlermeldung.
Anhang 36573

Dies geschieht beim ausführen von folgendem code, welcher updates suchen soll

Delphi-Quellcode:
procedure TForm1.updatesuch;
var nn, version:string;
begin
//prüft ob eine internetverbindung besteht
if IsOnline('mylittlerechner.funpic.de') then
begin
  //ermittelt die aktuelle Version des Programms
  version:= AboutBox.GetFileVersion(Paramstr(0));
  //ermittelt den pfad (Appdata - einstellungen)zum speichern der gedownloadeden datei
  nn:= GetEnvVarValue('AppData');
  //downloaded die datei
  if DownloadFile('http://mylittlerechner.my.funpic.de/mcversion/version.txt',(nn + '\versionneu.txt')) then
  begin
    //wenn erfolgreich dann wird diese in einem dialog angezeigt
// hier tritt der fehler auf
    UpDialog.Memo1.Lines.LoadFromFile((nn + '\versionneu.txt'));
    //vergleicht programmversion mit ermittelter version
    if UpDialog.Memo1.Lines[0] <> version then
     begin
     //macht den dialog sichtbar wo gesagt wird "update gefunden"
     UpDialog.Visible:= true;
     end;
  end;
end;
end;
dabei habe ich folgende funktionen benutzt

Delphi-Quellcode:
//downloaded datei
function DownloadFile(SourceFile, DestFile: string): Boolean;
begin
  try
    Result := UrlDownloadToFile(nil, PChar(SourceFile), PChar(DestFile), 0, nil) = 0;
  except
    Result := False;
  end;
end;

//prüft ob internet da anhand einer webseite

function IsOnline(Server: String): Boolean;
var
  wsaData: TWSAData;
begin
  WSAStartUp(MAKEWORD(1, 1), wsaData);
  Result := (GetHostByName(PChar(Server)) <> nil);
  WSACleanUp;
end;

//sucht appdata-pfad
function GetEnvVarValue(const VarName: string): string;
var
  BufSize: Integer; // buffer size required for value
begin
  // Get required buffer size (inc. terminal #0)
  BufSize := GetEnvironmentVariable(PChar(VarName), nil, 0);
  if BufSize > 0 then
  begin
    // Read env var value into result string
    SetLength(Result, BufSize - 1);
    GetEnvironmentVariable(PChar(VarName),
      PChar(Result), BufSize);
  end
  else
    // No such environment variable
    Result := '';
end;
//version herausfinden
function TAboutBox.GetFileVersion(Path: string): string;
var
  lpVerInfo: pointer;
  rVerValue: PVSFixedFileInfo;
  dwInfoSize: cardinal;
  dwValueSize: cardinal;
  dwDummy: cardinal;
  lpstrPath: pchar;

begin
  if Trim(Path) = EmptyStr then
    lpstrPath := pchar(ParamStr(0))
  else
    lpstrPath := pchar(Path);

  dwInfoSize := GetFileVersionInfoSize(lpstrPath, dwDummy);

  if dwInfoSize = 0 then
  begin
    Result := 'unbekannt';
    Exit;
  end;

  GetMem(lpVerInfo, dwInfoSize);
  GetFileVersionInfo(lpstrPath, 0, dwInfoSize, lpVerInfo);
  VerQueryValue(lpVerInfo, '\', pointer(rVerValue), dwValueSize);

  with rVerValue^ do
  begin
    Result := IntTostr(dwFileVersionMS shr 16);
    Result := Result + '.' + IntTostr(dwFileVersionMS and $FFFF);
    Result := Result + '.' + IntTostr(dwFileVersionLS shr 16);
  end;
  FreeMem(lpVerInfo, dwInfoSize);

end;
Delphi-Quellcode:
uses
  SysUtils, StdCtrls, FileCtrl, ShellApi,
  WinSock, ShlObj, ActiveX, URLMon;

Bernhard Geyer 23. Mär 2012 16:08

AW: Fehler beim ausführen eine Update-Funktion
 
Und wo genau (Quellcodezeile)?

NickelM 23. Mär 2012 17:32

AW: Fehler beim ausführen eine Update-Funktion
 
Also ich vermute einfach mal dass es an der function GetEnvVarValue Funktion liegt. Ich bin mir nicht sicher, ob dies so richtig funktioniert. Mach die Funktion mal so, das ist auch sicherer.

Delphi-Quellcode:
function GetEnvVarValue(const VarName: string): string;
var
  BufSize: Integer; // buffer size required for value
  Buffer : PChar;
begin
  //BuffSize ist nur die Textlänge, ohne nullterminiert.
  BufSize := GetEnvironmentVariable(PChar(VarName), nil, 0);
  if BufSize > 0 then
  begin
    //Speicher setzen
    GetMem(Buffer, (BufSize + 1)*SizeOf(Char)); //BufSize ist ohne nullterminierte, deshalb BufSize +1;
    GetEnvironmentVariable(PChar(VarName),
      Buffer, BufSize);
    Result := Buffer;
    FreeMem(Buffer);
  end
  else
    // No such environment variable
    Result := '';
end;

DeddyH 23. Mär 2012 17:36

AW: Fehler beim ausführen eine Update-Funktion
 
Hier könnte der Hase auch im Pfeffer liegen, wenn die Datei nicht existiert oder leer ist. Im ersten Fall schlägt das LoadFromFile fehl und im zweiten der Zugriff auf die erste Zeile des Memos.
Zitat:

Delphi-Quellcode:
UpDialog.Memo1.Lines.LoadFromFile((nn + '\versionneu.txt'));
    //vergleicht programmversion mit ermittelter version
    if UpDialog.Memo1.Lines[0] <> version then


himitsu 23. Mär 2012 18:02

AW: Fehler beim ausführen eine Update-Funktion
 
Das wirft aber keine Zugriffsverletzung.
Eine TStringList wirft einen EStringListError und TMemoStrings (die interne Klasse für TMemo.Lines) gibt einfach nur einen Leerstring raus, wenn der Index nicht paßt.

Hier sieht es eher so aus, also wenn irgendwo ein Objekt nicht existiert und auf NIL zugegriffen wird.

GetEnvVarValue ist eigentlich OK und sicher, auch wenn es nicht Unicodetauglich ist.
Ein Bufferoferun ist auch nicht zu erwarten. (höchstens daß der String falsch, also nur zur Hälfte, beschrieben wird)

Solange hier aber nicht die Fehlerstelle genannt wird, hat es wenig sinn hier weiterzusuchen.
Tipp: Es gibt auch ein [DELPHI]-Tag, denn so ist der Code nicht wirklich lesbar.

PS: Warum wandert die Datei eigentlich nach AppData und nicht nach Temp? Es ist wunderschön, wenn AppData mit solchen wunderschönen Dateien vollgemüllt wird, welche man nirgends zuordnen kann.

ol1uw 23. Mär 2012 18:30

AW: Fehler beim ausführen eine Update-Funktion
 
wer/was/wo/wann ruft den Funktion updatesuch auf?
Das Formular UpDialog zu diesem Zeitpunkt schon erzeugt?

Uwe

gelberkaktus 23. Mär 2012 19:11

AW: Fehler beim ausführen eine Update-Funktion
 
der Fehler tritt hier zwischen diesen beiden zeilen auf
Delphi-Quellcode:
    UpDialog.Memo1.Lines.LoadFromFile((nn + '\versionneu.txt'));
    if UpDialog.Memo1.Lines[0] <> version then
Nach der ersten zeile stockt der complier und spuckt den error aus (hatte ich das wirklich so undeutlich angegegeben)



Zitat:

Zitat von ol1uw (Beitrag 1158208)
wer/was/wo/wann ruft den Funktion updatesuch auf?
Das Formular UpDialog zu diesem Zeitpunkt schon erzeugt?

Uwe

Die Funktion updatesuch wird mit der Form1 aufgerufen (der hauptform) also startet mit dem Programm. (via FormCreate)

Das Formular UpDialog wird automatisch mit erzeugt.
...Nach der Form1....:idea:

daywalker9 23. Mär 2012 19:16

AW: Fehler beim ausführen eine Update-Funktion
 
Zitat:

Zitat von gelberkaktus (Beitrag 1158214)
der Fehler tritt hier zwischen diesen beiden zeilen auf
Delphi-Quellcode:
    UpDialog.Memo1.Lines.LoadFromFile((nn + '\versionneu.txt'));
    if UpDialog.Memo1.Lines[0] <> version then
Nach der ersten zeile stockt der complier und spuckt den error aus (hatte ich das wirklich so undeutlich angegegeben)

Du hattest es gar nicht angegeben.

MiKaEr 23. Mär 2012 19:21

AW: Fehler beim ausführen eine Update-Funktion
 
Zitat:

Die Funktion updatesuch wird mit der Form1 aufgerufen (der hauptform) also startet mit dem Programm. (via FormCreate)
hier liegt ja doch der fehler.

du versuchst hier auf eine form zuzugreifen, die noch gar nicht erzeugt wurde:
Delphi-Quellcode:
if UpDialog.Memo1.Lines[0] <> version then
da ist die zugriffsverletzung normal.

schieb das obige einfach ins oncreate von UpDialog und dann sollte es funktionieren.

himitsu 23. Mär 2012 19:27

AW: Fehler beim ausführen eine Update-Funktion
 
UpDialog ist also die globale Variable für TUpDialog, welches automatisch erzeugt wird und wo du im OnCreate diesen Code ausfürst?

Selbst Schuld. :twisted:
Was nutzt du auch globale Variablen, welche zu diesem Zeitpunkt noch nicht initialisiert sind. :tongue:


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:47 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