szFileN > kein Speicher reserviert
nMaxFile := SizeOf(szFileN);
> szFileN ist ein Pointer, also stimmt die Länge nicht, abgrsehn davon daß nMaxFile in Chars und nicht in Bytes angegeben werden muß.
Warum müssen denn ständig welche
Ansi,
Unicode und Dynamisch vermischen?
PAnsiChar/AnsiString/TOpenFileNameA
oder
PWideChar/WideString/UnicodeString/TOpenFileNameW
oder
PChar/String/TOpenFileName
Delphi-Quellcode:
function OpenSaveFileDialog(ParentHandle: THandle; fFlags: Integer; const DefExt, Filter, InitialDir,
Title: string; var FileName: string;
out ReadOnly: Boolean; IsOpenDialog: Boolean): Boolean; overload;
var
ofn: TOpenFileName;
szFileN: array[1..MAX_PATH] of Char;
begin
//Move(szFileN, PChar(FileName)^, (Length(FileName) + 1) * SizeOf(Char));
FillChar(szFileN, SizeOf(szFileN), 0);
FillChar(ofn, SizeOf(ofn), 0);
with ofn do
begin
lStructSize := SizeOf(ofn);
hwndOwner := ParentHandle;
lpstrFile := @szFileN;
nMaxFile := Length(szFileN);
if Title <> '' then
lpstrTitle := PChar(Title);
flags := fFlags;
if InitialDir <> '' then
lpstrInitialDir := PChar(InitialDir);
lpstrFilter := PChar(CharReplace(Filter, '|', #0) + #0#0);
if DefExt <> '' then
lpstrDefExt := PChar(DefExt);
lpfnHook := nil;
end;
//if IsOpenDialog then
//begin
// if GetOpenFileName(ofn) then
// begin
// Result := True;
// ReadOnly := ofn.Flags and OFN_READONLY = OFN_READONLY;
// FileName := szFileN;
// end;
//end
//else
//begin
// if GetSaveFileName(ofn) then
// begin
// Result := True;
// FileName := szFileN;
// end;
//end;
Result := (IsOpenDialog and GetOpenFileName(ofn))
or (not IsOpenDialog and GetSaveFileName(ofn));
if Result then
begin
ReadOnly := ofn.Flags and OFN_READONLY = OFN_READONLY;
FileName := szFileN;
end;
end;