![]() |
Access Violation beim Kopieren aus Record
Hallo erstmal :)
Ich hab mal wieder ein Problem und hoffe, dass ihr mir helfen könnt. Situation: Ich hab einen Record von dieser Art:
Delphi-Quellcode:
In meiner erstern Prozedur reservier ich einen Speicherbereich mit diesem Record:
type
Prec = ^Trec; Trec = record consock: TSocket; end;
Delphi-Quellcode:
Als nächstes ruf ich einen Prozedur auf mit dem record arbeiten sollen:
var
recObj: Prec; GetMem(recObj, sizeof(Trec)); sendObj.consock := tmpSock[der tut nix zur Sache, kommt aus einem WinSock accept Vorgang];
Delphi-Quellcode:
Bei dem CopyMemory bekomm ich dann aber eine Access Violation, warum versteh ich leider momentan nicht.
procedure bla(recObj: Prec);
var p: pointer; begin GetMem(p, sizeof(TSocket)); CopyMemory(p, pointer(recObj.consock), sizeof(TSocket)); end; Ich hoffe jemand kann mir sagen wo das Problem liegt und villeicht auch den Hintergund ein wenig erläutern. |
Re: Access Violation beim Kopieren aus Record
Wahrscheinlich meinst du
Delphi-Quellcode:
Aber sage - was bringt es? sizeof(Pointer) = sizeof(TSocket), also musst du schon einen sehr guten Grund für einfeldrecordrumgepointere bringen.. ;)
CopyMemory(p^, recObj.consock, sizeof(TSocket));
edits: gnah, typo.. |
Re: Access Violation beim Kopieren aus Record
Zitat:
Übrigens danke für die Hilfe. edit: Funktioniert so noch weniger. p ist kein untyped Pointer und recObj.consock kein Pointer. |
Re: Access Violation beim Kopieren aus Record
Was sagt denn "move"?
Edit: Aber ein TSocket ist ein Handle. Du wirst mit dem Pointer nicht auf den TCB kommen, falls du das vor hast. |
Re: Access Violation beim Kopieren aus Record
Hmm.. Oke, ich sollte Spekulationen über die Syntax unterlassen, hab schon lange kein Delphi mehr benutzt *g*
Aber zum Thema: ^record kann sehr oft (gewinnbringend) durch class ersetzt werden, hast du darüber schon einmal nachgedacht? Deine GetMem-Aufrufe vereinfachen sich zu einem .Create und das CopyMemory-Beispiel ließe sich über einen Kopierkonstruktor oder eine .Clone-Methode sehr elegant lösen. Wenn du zusätzlich noch ein Interface implementierst, von TInterfacedObject ableitest und fortan nur noch mit dem Interface arbeitest, musst du dich nicht mal um die Speicherfreigabe kümmern. |
Re: Access Violation beim Kopieren aus Record
Pointer(recObj.consock) - Böse Sache. Damit verwandelst du recObj.consock in einen Pointer und kopierst den Wert, der an der Stelle mit dem Index von recObj.consock steht, wiederum einem Pointer zu. Wirklich äußerst unschöne Sache, denn recObj.consock ist wahrscheinlich ein Handle, d.h. sobald du versuchen willst, auf den Speicher an dieser Stelle zuzugreifen, stellst du eine üble Sauerei im Speicher an, die natürlich als Zugriffsverletzung abgefangen wird.
So ist es richtig:
Delphi-Quellcode:
procedure bla(recObj: Prec);
var p: pointer; begin GetMem(p, sizeof(TSocket)); CopyMemory(p, @recObj.consock, sizeof(TSocket)); end; |
Re: Access Violation beim Kopieren aus Record
Zitat:
|
Re: Access Violation beim Kopieren aus Record
Dann könntest du es auch einfach so machen:
Delphi-Quellcode:
p^:=recObj.consock;
|
Re: Access Violation beim Kopieren aus Record
Zitat:
Jetz kommts ja, ich versuche einen Pointer zu einer Art Buffer zu erstellen. Dabei kopier ich mehrere Arten von Daten an den Speicherort. Um das zu tun müsste ich jetz noch gerausfinden wie ich inc() einsetze um meine Pointer Addresse zu erhöhen. |
Re: Access Violation beim Kopieren aus Record
Wie gesagt, mein Tipp oben (in meinem ersten Beitrag) wird funktionieren. Und um einen Pointer zu erhöhen, reicht ein einfacher Typecast.
So zum Beispiel: Integer(p):=Integer(p)+1; Oder auch: inc(Integer(p)); |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18: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