![]() |
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:
dabei habe ich folgende funktionen benutzt
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;
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; |
AW: Fehler beim ausführen eine Update-Funktion
Und wo genau (Quellcodezeile)?
|
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; |
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:
|
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. |
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 |
AW: Fehler beim ausführen eine Update-Funktion
der Fehler tritt hier zwischen diesen beiden zeilen auf
Delphi-Quellcode:
Nach der ersten zeile stockt der complier und spuckt den error aus (hatte ich das wirklich so undeutlich angegegeben)
UpDialog.Memo1.Lines.LoadFromFile((nn + '\versionneu.txt'));
if UpDialog.Memo1.Lines[0] <> version then Zitat:
Das Formular UpDialog wird automatisch mit erzeugt. ...Nach der Form1....:idea: |
AW: Fehler beim ausführen eine Update-Funktion
Zitat:
|
AW: Fehler beim ausführen eine Update-Funktion
Zitat:
du versuchst hier auf eine form zuzugreifen, die noch gar nicht erzeugt wurde:
Delphi-Quellcode:
da ist die zugriffsverletzung normal.
if UpDialog.Memo1.Lines[0] <> version then
schieb das obige einfach ins oncreate von UpDialog und dann sollte es funktionieren. |
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: |
AW: Fehler beim ausführen eine Update-Funktion
Jetzt tut sich das Problem auf, dass die Hauptform nun die UpdateForm verdeckt.
|
AW: Fehler beim ausführen eine Update-Funktion
mainform:
setz doch im oncreate eine boolsche variable (irgendein name) auf false. im onshow-ereignis folgendes:
Delphi-Quellcode:
wenn boolsche-variable false dann
[ > der update-kram > boolsche-variable auf true setzen ] |
AW: Fehler beim ausführen eine Update-Funktion
Es wird doch möglich sein, im OnCreate des Hauptformulares das benötigte Unterformular 'per Hand' zu instantiieren, BEVOR man darauf zugreift:
Regel #79,518: Kontrolliere Deine Vasallen: D.h. Erzeuge sie selber und gib sie wieder frei. |
AW: Fehler beim ausführen eine Update-Funktion
Oder wähle einen geeigneten Owner.
|
AW: Fehler beim ausführen eine Update-Funktion
Wenn er die Form in onCreate erstellt und das Memo dort gefüllt wird kann er sie doch einfach
auf hide setzen vorrausgesetzt er benötigt sie nur als Platzhalter für das Memo. Sollte das der Fall sein warum dann nicht einfach eine TStringList anstelle des Memo dann wäre die Form ansicht nicht mehr nötig. Etwas verworren das ganze Quelltext nicht von ihm (Copy/Paste?) Sorry dann wundert es mich nicht! gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:10 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-2025 by Thomas Breitkreuz