Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Win7x64/DelphiXE2: Dateien in die Zwischenablage kopieren? (https://www.delphipraxis.net/170074-win7x64-delphixe2-dateien-die-zwischenablage-kopieren.html)

PeterPanino 29. Aug 2012 15:26

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:
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;
Nun scheint es aber (wegen Windows 7x64? Delphi XE2?) nicht mehr zu funktionieren. Kann jemand das bestätigen?

himitsu 29. Aug 2012 15:31

AW: Win7x64/DelphiXE2: Dateien in die Zwischenablage kopieren?
 
Zitat:

In früheren Delphi/Windows-Versionen
In welchen?

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:

himitsu 29. Aug 2012 15:39

AW: Win7x64/DelphiXE2: Dateien in die Zwischenablage kopieren?
 
Tipp: Schau mal, was zu MSDN-Library durchsuchenCF_HDROP im MSDN drin steht. :stupid:

Und das Thema Pointer-Arithmetik solltest du dir auch nochmal ansehn, denn
Delphi-Quellcode:
PWideChar(DropFiles) + x
rechnet nicht das was du willst.

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;

Bummi 29. Aug 2012 15:56

AW: Win7x64/DelphiXE2: Dateien in die Zwischenablage kopieren?
 
unter http://www.delphipraxis.net/153331-%...ieren-pdf.html

#7

wird eine Version beschrieben die bei mir Server 2008 R2 / XE
im Gegensatz zu Deiner funktioniert.

PeterPanino 29. Aug 2012 16:01

AW: Win7x64/DelphiXE2: Dateien in die Zwischenablage kopieren?
 
Ich habe gerade den Beitrag von "MarcoWarm" gefunden, dessen Methode klaglos funktioniert:

http://www.delphipraxis.net/1038948-post7.html

Es war, so wie ich vermutet hatte, ein Unicode-Problem.

Danke jedoch, Himitsu für die Hinweise.

PeterPanino 29. Aug 2012 16:04

AW: Win7x64/DelphiXE2: Dateien in die Zwischenablage kopieren?
 
Zitat:

Zitat von Bummi (Beitrag 1180532)
unter http://www.delphipraxis.net/153331-%...ieren-pdf.html

#7

wird eine Version beschrieben die bei mir Server 2008 R2 / XE
im Gegensatz zu Deiner funktioniert.

Vielen Dank, hatte deinen Beitrag vor dem Posten noch nicht gesehen!

himitsu 29. Aug 2012 16:18

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 02:16 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz