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/)
-   -   Problem mit FastCode und CopyMemory (https://www.delphipraxis.net/173680-problem-mit-fastcode-und-copymemory.html)

lbccaleb 10. Mär 2013 20:19

Problem mit FastCode und CopyMemory
 
Hallo,

Ich benutze folgende Funktion um Text in die Zwischenablage zu kopieren:

Delphi-Quellcode:
function SetClipText(szText: string): Boolean;
var
  pData: DWORD;
  dwSize: DWORD;
begin;
  Result := FALSE;
  OpenClipBoard(0);
  try
    EmptyClipboard;
    dwSize := Length(szText) + 1;
    if dwSize <> 0 then begin;
      pData := GlobalAlloc(MEM_COMMIT, dwSize);
      try
        CopyMemory(POINTER(pData), PChar(szText), dwSize);
        if SetClipBoardData(CF_TEXT, pData) <> 0 then
          Result := TRUE;
      except
        GlobalFree(pData);
        raise;
      end;
    end;
  finally
    CloseClipBoard;
  end;
end;
Das funktioniert auch immer Problemlos.
Aufeinmal allerdings nicht mehr, und die Fehlersuche ging los.

Durch das debuggen habe ich dann bemerkt, dass die eingebundene Unit FastCode dafür verantwortlich ist, dass dort irgendein Problem bei CopyMemory vorliegt.
Nur weil diese Funktion jetzt nicht geht, wollte ich allerdings nicht auf die FastCode Unit verzichten.

Gibt es also Jemanden der sich mit Assembler besser auskennt als ich, und den Fehler finden kann?
Beim Aufruf von CopyMemory springt er in die Unit FastMove in die Funktion "Forwards_SSE3_10;". Komischerweise rufe ich an anderen Stellen auch CopyMemory auf, und habe dort allerdings nicht die Probleme.

Kann es vllt. auch sein, das ich ein Fehler bei der Parameterübergabe von CopyMemory habe?

mfg Martin


Edit:
Achso, das Problem äußert sich übrigens darin, dass unter Verwendung von FastCode nichts mehr in die Zwischenablage kopiert wird.

lbccaleb 10. Mär 2013 20:34

AW: Problem mit FastCode und CopyMemory
 
Aus einem mir absolut nicht bekannten Grund, funktioniert es jetzt auf einmal.
Hat sich also erledigt :glaskugel:

Bernhard Geyer 10. Mär 2013 21:48

AW: Problem mit FastCode und CopyMemory
 
Delphi-Quellcode:
dwSize := Length(szText) + 1;
    if dwSize <> 0 then begin;
Mmmmh. Ob das sinnvoll? Leerer Text liefert 1 zurück. Ich denke der Code sollte nur kopieren wenn wirklich ein Text vorliegt.

Und ab D2009 krachts eh da Char = 2 Byte ist.

p80286 10. Mär 2013 21:57

AW: Problem mit FastCode und CopyMemory
 
Verwechselst Du da nicht
Delphi-Quellcode:
sizeof
und
Delphi-Quellcode:
length
?
Soweit ich weiß, funktioniert
Delphi-Quellcode:
length
immer wie gewünscht.

Gruß
K-H

Sir Rufo 11. Mär 2013 06:30

AW: Problem mit FastCode und CopyMemory
 
Zitat:

Zitat von p80286 (Beitrag 1206778)
Verwechselst Du da nicht
Delphi-Quellcode:
sizeof
und
Delphi-Quellcode:
length
?
Soweit ich weiß, funktioniert
Delphi-Quellcode:
length
immer wie gewünscht.

Gruß
K-H

Delphi-Quellcode:
Length( 'Text' )
ergibt - egal ob Unicode oder nicht - immer
Delphi-Quellcode:
4
.
Den benötigten Speicher berechnet man aber sicher mit
Delphi-Quellcode:
Length( 'Text' ) * SizeOf( Char )
, denn der ist bei nicht Unicode
Delphi-Quellcode:
4
und als Unicode
Delphi-Quellcode:
8

lbccaleb 11. Mär 2013 09:29

AW: Problem mit FastCode und CopyMemory
 
Zitat:

Zitat von Sir Rufo (Beitrag 1206786)
Zitat:

Zitat von p80286 (Beitrag 1206778)
Verwechselst Du da nicht
Delphi-Quellcode:
sizeof
und
Delphi-Quellcode:
length
?
Soweit ich weiß, funktioniert
Delphi-Quellcode:
length
immer wie gewünscht.

Gruß
K-H

Delphi-Quellcode:
Length( 'Text' )
ergibt - egal ob Unicode oder nicht - immer
Delphi-Quellcode:
4
.
Den benötigten Speicher berechnet man aber sicher mit
Delphi-Quellcode:
Length( 'Text' ) * SizeOf( Char )
, denn der ist bei nicht Unicode
Delphi-Quellcode:
4
und als Unicode
Delphi-Quellcode:
8


Also müsste ich so den Speicher reservieren?

Delphi-Quellcode:
function SetClipText(szText: string): Boolean;
var
  pData: DWORD;
  dwSize: DWORD;
begin;
  Result := FALSE;
  OpenClipBoard(0);
  try
    EmptyClipboard;
    if Length(szText) > 0 then begin;
      dwSize := Length(szText) * SizeOf(Char);
      pData := GlobalAlloc(MEM_COMMIT, dwSize);
      try
        CopyMemory(POINTER(pData), PChar(szText), dwSize);
        Result := (SetClipBoardData(CF_TEXT, pData) <> 0);
      except
        GlobalFree(pData);
        raise;
      end;
    end;
  finally
    CloseClipBoard;
  end;
end;

Bernhard Geyer 11. Mär 2013 09:35

AW: Problem mit FastCode und CopyMemory
 
Wieso überhaupt eine eigene Funktion?

Delphi-Quellcode:
Clipboard.AsText := szText

lbccaleb 11. Mär 2013 09:36

AW: Problem mit FastCode und CopyMemory
 
Bei mir fast alles immer nonVCL ;)

Sir Rufo 11. Mär 2013 09:39

AW: Problem mit FastCode und CopyMemory
 
Wenn du einen nullterminierten String übergeben musst, dann benötigst du noch ein Zeichen mehr als Speicher ;)

Aber ansonsten passt das schon

Bernhard Geyer 11. Mär 2013 09:56

AW: Problem mit FastCode und CopyMemory
 
Zitat:

Zitat von lbccaleb (Beitrag 1206818)
Bei mir fast alles immer nonVCL ;)

Viel VCL wird bei TClipboard nicht eingebunden (nur Forms.pas).

lbccaleb 11. Mär 2013 10:03

AW: Problem mit FastCode und CopyMemory
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1206828)
Zitat:

Zitat von lbccaleb (Beitrag 1206818)
Bei mir fast alles immer nonVCL ;)

Viel VCL wird bei TClipboard nicht eingebunden (nur Forms.pas).

Ja, das mag sein, aber dann schau mal in die Form.pas, denn da gehts sofort weiter:

uses
Messages, Windows, SysUtils, Classes, Graphics, Menus, Controls, Imm,
ActnList, MultiMon, HelpIntfs;

Mit meiner Version, benutze ich zur Zeit gerade mal Windows und Messages. Und meine eigene SysUtils :)

Aber das ist ne andere Geschichte jetzt.

Sir Rufo 11. Mär 2013 14:02

AW: Problem mit FastCode und CopyMemory
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1206828)
Zitat:

Zitat von lbccaleb (Beitrag 1206818)
Bei mir fast alles immer nonVCL ;)

Viel VCL wird bei TClipboard nicht eingebunden (nur Forms.pas).

Der ist nicht schlecht ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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