Hallo!
Ich habe eine Liste in die ich Dateinamen einfügen kann. Das geht auf 3 verschiedene Weisen:
1) Dateinamen (Strings) aus Clipboard einfügen
2) Dateien (HDROP) per Drag&Drop einfügen
3) Dateien (HDROP) aus Clipboard einfügen
1) und 2) funktionieren einwandfrei, bei 3) bekomme ich aber häufig einen Error (OutOfMemory oder Zugriffsverletzung an einer anderen Stelle. Ich glaube beim Zeichnen des Strings ist der String ungültig, zu lang o.Ä.). Besonders wenn ich eine Datei aus dem Explorer kopiere und sie 2 Mal einfüge bekomme ich zu 95% einen Error. Die erste Datei einfügen klappt (fast?) immer und wenn ich mehrere verschiedene Dateien einfüge kommt erst bei der ~20. Datei einen Error.
Das merkwürdige dabei ist, dass sich der Code von 2) und 3) kaum unterscheidet:
2) Dateien per Drag&Drop einfügen
Delphi-Quellcode:
procedure TFrm_ProcessFiles.ApplicationEventsMessage(var Msg: tagMSG; var Handled: Boolean);
begin
if Msg.message = WM_DROPFILES then begin
DropFiles(Msg.wParam);
end;
end;
3) Dateien aus Clipboard einfügen
Delphi-Quellcode:
procedure AddParamsFromClipboard;
var
hDrop: THandle;
begin
if IsClipboardFormatAvailable(CF_HDROP) then begin
if OpenClipboard(0) then begin
Try
hDrop := Windows.GetClipboardData(CF_HDROP);
if hDrop <> 0 then begin
DropFiles(hDrop);
end;
Finally
CloseClipboard;
End;
end;
end;
end;
DropFiles
Delphi-Quellcode:
procedure TFrm_ProcessFiles.DropFiles(hDrop: THandle);
function GetFileOrDirNames(hDrop: THandle): TDynStrArr;
const
DF_NUMBEROFFILES = $FFFFFFFF;
var
i, filesCount, fileNameLen: Integer;
begin
filesCount := DragQueryFile(hDrop, DF_NUMBEROFFILES, nil, 0);
SetLength(Result, filesCount);
for i := 0 to Pred(filesCount) do begin
fileNameLen := DragQueryFile(hDrop, i, nil, 0);
SetLength(Result[i], fileNameLen);
{$IFDEF WIDE}DragQueryFileW{$ELSE}DragQueryFileA{$ENDIF}(hDrop, i, @Result[i][1], fileNameLen+1);
end;
DragFinish(hDrop);
end;
begin
AddParams(GetFileOrDirNames(hDrop));
end;
Vielen Dank im Voraus!
Grüße
blablab