![]() |
Problem mit FastCode und CopyMemory
Hallo,
Ich benutze folgende Funktion um Text in die Zwischenablage zu kopieren:
Delphi-Quellcode:
Das funktioniert auch immer Problemlos.
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; 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 ![]() 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. |
AW: Problem mit FastCode und CopyMemory
Aus einem mir absolut nicht bekannten Grund, funktioniert es jetzt auf einmal.
Hat sich also erledigt :glaskugel: |
AW: Problem mit FastCode und CopyMemory
Delphi-Quellcode:
Mmmmh. Ob das sinnvoll? Leerer Text liefert 1 zurück. Ich denke der Code sollte nur kopieren wenn wirklich ein Text vorliegt.
dwSize := Length(szText) + 1;
if dwSize <> 0 then begin; Und ab D2009 krachts eh da Char = 2 Byte ist. |
AW: Problem mit FastCode und CopyMemory
Verwechselst Du da nicht
Delphi-Quellcode:
und
sizeof
Delphi-Quellcode:
?
length
Soweit ich weiß, funktioniert
Delphi-Quellcode:
immer wie gewünscht.
length
Gruß K-H |
AW: Problem mit FastCode und CopyMemory
Zitat:
Delphi-Quellcode:
ergibt - egal ob Unicode oder nicht - immer
Length( 'Text' )
Delphi-Quellcode:
.
4
Den benötigten Speicher berechnet man aber sicher mit
Delphi-Quellcode:
, denn der ist bei nicht Unicode
Length( 'Text' ) * SizeOf( Char )
Delphi-Quellcode:
und als Unicode
4
Delphi-Quellcode:
8
|
AW: Problem mit FastCode und CopyMemory
Zitat:
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; |
AW: Problem mit FastCode und CopyMemory
Wieso überhaupt eine eigene Funktion?
Delphi-Quellcode:
Clipboard.AsText := szText
|
AW: Problem mit FastCode und CopyMemory
Bei mir fast alles immer nonVCL ;)
|
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 |
AW: Problem mit FastCode und CopyMemory
Zitat:
|
AW: Problem mit FastCode und CopyMemory
Zitat:
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. |
AW: Problem mit FastCode und CopyMemory
Zitat:
|
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