Ich habe ein Problem mit dem SetLength
Befehl.Alternative zu SetLength
Es ist im Grunde dieses Problem:
ich mit WindowsAPI
arbeiten nur so gut, wie ich kann. Mein Ziel ist es, eine bestimmte Größe zu einem dynamischen Array von Zeichen zu setzen:
Hier einige Code zu verstehen:
var
thefile : array of char;
// or thefile : array [0..9999] of char; // <---- not really a good way, works tho
FileHandle := CreateFileA(paramstr0, GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
dwSize := GetFileSize(FileHandle,NIL);
SetFilePointer(FileHandle, 0, nil, FILE_BEGIN);
SetLength(TheFile, dwsize); // <--- I can't use this
ReadFile(FileHandle, thefile[1], dwSize , dwRead, nil);
CloseHandle (FileHandle);
CloseHandle(CreateFileA (sfile, 0, 0,NIL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL,0));
FileHandle := CreateFileA(sFile, GENERIC_WRITE, FILE_SHARE_WRITE, nil, CREATE_ALWAYS, 0, 0);
WriteFile (FileHandle, thefile, dwSize, testCardinal, NIL);
CloseHandle (FileHandle);
Wie kann ich ersetzen SetLength
? Ich möchte auch verstehen, wie Windows/Delphi das Array im Speicher reserviert usw. Vielen Dank für Ihre Hilfe
Vielen Dank für Ihre Hilfe. Versuchen Sie es und schließlich ist ein guter Tipp, um Fehler zu vermeiden. –
try..finally macht Sinn, wenn Ausnahmen ausgelöst werden, aber hier, ich vermute, dass nur ein wenig Speicher eine Ausnahme auslösen kann, da Windows-APIs keine Ausnahmen auslösen, sondern Fehlercodes zurückgeben. Zum Beispiel kann die ReadFile() - Funktion bei einem Fehler FALSE zurückgeben. In jedem Fall ist die Verwendung von APIs in diesem Fall nicht sinnvoll. Und das Hinzufügen von 'SetLength (TheFile, 0)' am Ende wird überhaupt nicht benötigt - dies wird bereits vom Compiler erledigt. –
@ArnaudBouchez, Sie können nie 100% sicher sein, wo eine Ausnahme ausgelöst wird oder ob eine "inoffensive" Codezeile eine Ausnahme auslösen kann, in diesem Fall stellt der try ... schließlich sicher, dass die offene Datei-Handle geschlossen wird. über den error handle vielleicht habe ich die Erwähnung über die 'RaiseLastOSError' Funktion vergessen, endlich über den' SetLength (TheFile, 0) 'erinnere mich, dass dieser Code unvollständig ist und wir den Kontext nicht kennen, also vielleicht die' TheFile' Variable an einem anderen Ort wiederverwendet werden. Jedenfalls gibt es immer einen Raum, um eine Antwort zu verbessern, aber ich denke, dass dieser hier vollständig genug ist. – RRUZ