![]() |
Win7x64/DelphiXE2: Dateien in die Zwischenablage kopieren?
Hallo! In früheren Delphi/Windows-Versionen habe ich häufig folgende Methode verwendet, um Dateien in die Zwischenablage zu kopieren:
Delphi-Quellcode:
Nun scheint es aber (wegen Windows 7x64? Delphi XE2?) nicht mehr zu funktionieren. Kann jemand das bestätigen?
procedure CopyFilesToClipboard(FileList: string);
{Achtung: Dateien mit einem #0 trennen! Beispiel: procedure TForm1.Button1Click(Sender: TObject); begin CopyFilesToClipboard('C:\Bootlog.Txt'#0'C:\AutoExec.Bat'); end;} var DropFiles: PDropFiles; hGlobal: THandle; iLen: Integer; begin iLen := Length(FileList) + 2; FileList := FileList + #0#0; hGlobal := GlobalAlloc(GMEM_SHARE or GMEM_MOVEABLE or GMEM_ZEROINIT, SizeOf(TDropFiles) + iLen); if (hGlobal = 0) then raise Exception.Create('Could not allocate memory.'); begin DropFiles := GlobalLock(hGlobal); DropFiles^.pFiles := SizeOf(TDropFiles); Move(FileList[1], (PChar(DropFiles) + SizeOf(TDropFiles))^, iLen); GlobalUnlock(hGlobal); ClipBoard.SetAsHandle(CF_HDROP, hGlobal); end; end; |
AW: Win7x64/DelphiXE2: Dateien in die Zwischenablage kopieren?
Zitat:
Vor oder ab/nach Delphi 2009? Der Code sieht mir sehr ANSIig aus. :stupid: Und geht es nur nicht, wenn du mit "Win64" als Ziel kompilierst, oder geht es nie? :angle2: |
AW: Win7x64/DelphiXE2: Dateien in die Zwischenablage kopieren?
Tipp: Schau mal, was zu
![]() Und das Thema Pointer-Arithmetik solltest du dir auch nochmal ansehn, denn
Delphi-Quellcode:
rechnet nicht das was du willst.
PWideChar(DropFiles) + x
ungetesteter Vorschlag?
Delphi-Quellcode:
procedure CopyFilesToClipboard(FileList: string);
{Achtung: Dateien mit einem #0 trennen! Beispiel: procedure TForm1.Button1Click(Sender: TObject); begin CopyFilesToClipboard('C:\Bootlog.Txt'#0'C:\AutoExec.Bat'); end;} var DropFiles: PDropFiles; hGlobal: THandle; iLen: Integer; begin FileList := FileList + #0#0; iLen := Length(FileList) * SizeOf(Char); hGlobal := GlobalAlloc(GMEM_SHARE or GMEM_MOVEABLE or GMEM_ZEROINIT, SizeOf(TDropFiles) + iLen); if hGlobal = 0 then raise Exception.Create('Could not allocate memory.'); DropFiles := GlobalLock(hGlobal); DropFiles.pFiles := SizeOf(TDropFiles); DropFiles.fWide := SizeOf(Char) <> 1; Move(FileList[1], (PAnsiChar(DropFiles) + SizeOf(TDropFiles))^, iLen); GlobalUnlock(hGlobal); Clipboard.SetAsHandle(CF_HDROP, hGlobal); end; procedure CopyFilesToClipboard(FileList: TStrings); var LB: string; begin LB := FileList.LineBreak; try FileList.LineBreak := #0; CopyFilesToClipboard(FileList.Text); finally FileList.LineBreak := LB; end; end; |
AW: Win7x64/DelphiXE2: Dateien in die Zwischenablage kopieren?
unter
![]() #7 wird eine Version beschrieben die bei mir Server 2008 R2 / XE im Gegensatz zu Deiner funktioniert. |
AW: Win7x64/DelphiXE2: Dateien in die Zwischenablage kopieren?
Ich habe gerade den Beitrag von "MarcoWarm" gefunden, dessen Methode klaglos funktioniert:
![]() Es war, so wie ich vermutet hatte, ein Unicode-Problem. Danke jedoch, Himitsu für die Hinweise. |
AW: Win7x64/DelphiXE2: Dateien in die Zwischenablage kopieren?
Zitat:
|
AW: Win7x64/DelphiXE2: Dateien in die Zwischenablage kopieren?
Hab jetzt nich so die Zeit zum Testen.
Aber laut MSDN ist diese Struktur wohl erstmal ANSI, es sei denn man setzt das "Wide"-Flag. :gruebel: Aber selbst wenn, hier wurde die Länge ursprünglich nur für ANSI korrekt berechnet und bei Unicode fehlt dann die Hälfte. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:16 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