Hi,
ich wollte mal testen, wie man Daten beliebiger Länge aus meiner eigenen Programmdatei ausließt. Die Daten habe ich mit einem Hex Editor einfach hinten an die EXE angehangen.
Folgender Code liefert mir allerdings immer eine
AV, wobei das Ermitteln der Datengröße immer funktioniert, aber der zweite Codeteil nicht:
Delphi-Quellcode:
var
szReadData: Array[0..16] of Char;
szData: array of Char;
szTmp: String;
iTmp: Integer;
iBytesRead: DWORD;
fhSource: THandle;
FSize: int64;
CfgFile: TStringList;
begin
//Dateigröße ermitteln
szReadData := '';
iBytesRead := 0;
fhSource := INVALID_HANDLE_VALUE;
fhSource := CreateFile(PChar(ParamStr(0)),
GENERIC_READ,
FILE_SHARE_READ,
nil,
OPEN_EXISTING,
0,
0);
if (fhSource <> INVALID_HANDLE_VALUE) then
begin
SetFilePointer(fhSource, -15, nil, FILE_END);
ReadFile(fhSource, szReadData, 15, iBytesRead, nil);
CloseHandle(fhSource);
if (iBytesRead = 15) then
begin
showmessage(Trim(Copy(szReadData, 1, 15)));
try
FSize := StrToInt(Trim(Copy(szReadData, 1, 15)));
except
Exit;
end;
end;
end
else
begin
Exit;
end;
//Datei auslesen
iBytesRead := 0;
fhSource := INVALID_HANDLE_VALUE;
setLength(szData, FSize +1);
fhSource := CreateFile(PChar(ParamStr(0)),
GENERIC_READ,
FILE_SHARE_READ,
nil,
OPEN_EXISTING,
0,
0);
if (fhSource <> INVALID_HANDLE_VALUE) then
begin
SetFilePointer(fhSource, -(FSize + 15), nil, FILE_END);
ReadFile(fhSource, szData, FSize, iBytesRead, nil);
CloseHandle(fhSource);
if (iBytesRead = 10) then
begin
CfgFile := TStringList.Create;
try
CfgFile.DelimitedText := Copy(szData, 1, FSize);
showmessage(cfgfile.text);
finally
CfgFile.Free;
end;
end;
end;
end;
Meine angehangenen Daten sehen wie folgt aus:
Es kommen immer zuerst die Daten und dann 15 stellen für die Datenlänge.
Ich hoffe es kann mir da jemand helfen.
Florian