Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Access Violation beim Kopieren aus Record (https://www.delphipraxis.net/102711-access-violation-beim-kopieren-aus-record.html)

T-MagX 2. Nov 2007 20:33


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:
type
  Prec = ^Trec;
  Trec = record
    consock: TSocket;
  end;
In meiner erstern Prozedur reservier ich einen Speicherbereich mit diesem Record:
Delphi-Quellcode:
var
  recObj: Prec;

GetMem(recObj, sizeof(Trec));
sendObj.consock := tmpSock[der tut nix zur Sache, kommt aus einem WinSock accept Vorgang];
Als nächstes ruf ich einen Prozedur auf mit dem record arbeiten sollen:
Delphi-Quellcode:
procedure bla(recObj: Prec);
var p: pointer;
begin
  GetMem(p, sizeof(TSocket));
  CopyMemory(p, pointer(recObj.consock), sizeof(TSocket));
end;
Bei dem CopyMemory bekomm ich dann aber eine Access Violation, warum versteh ich leider momentan nicht.
Ich hoffe jemand kann mir sagen wo das Problem liegt und villeicht auch den Hintergund ein wenig erläutern.

Dax 2. Nov 2007 20:36

Re: Access Violation beim Kopieren aus Record
 
Wahrscheinlich meinst du
Delphi-Quellcode:
CopyMemory(p^, recObj.consock, sizeof(TSocket));
Aber sage - was bringt es? sizeof(Pointer) = sizeof(TSocket), also musst du schon einen sehr guten Grund für einfeldrecordrumgepointere bringen.. ;)

edits: gnah, typo..

T-MagX 2. Nov 2007 20:41

Re: Access Violation beim Kopieren aus Record
 
Zitat:

Zitat von Dax
Wahrscheinlich meinst du
Delphi-Quellcode:
CopyMemory(p^, recObj.consock, sizeof(TSocket));
Aber sage - was bringt es? sizeof(Pointer) = sizeof(TSocket), also musst du schon einen sehr guten Grund für einfeldrecordrumgepointere bringen.. ;)

edits: gnah, typo..

Ist nicht ein Feld. Ist blos ein Beispiel Code aus dem Original aufs nötigste beschränkt.
Übrigens danke für die Hilfe.
edit: Funktioniert so noch weniger. p ist kein untyped Pointer und recObj.consock kein Pointer.

sirius 2. Nov 2007 20:48

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.

Dax 2. Nov 2007 20:49

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.

3_of_8 2. Nov 2007 20:52

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;

T-MagX 2. Nov 2007 20:53

Re: Access Violation beim Kopieren aus Record
 
Zitat:

Zitat von sirius
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.

Ich gedenke die Nummer des Handles herumzukopieren. TSocket is ja nur die Bezeichnung eines Integers.

3_of_8 2. Nov 2007 21:12

Re: Access Violation beim Kopieren aus Record
 
Dann könntest du es auch einfach so machen:

Delphi-Quellcode:
p^:=recObj.consock;

T-MagX 2. Nov 2007 22:11

Re: Access Violation beim Kopieren aus Record
 
Zitat:

Zitat von 3_of_8
Dann könntest du es auch einfach so machen:

Delphi-Quellcode:
p^:=recObj.consock;

Ja geht nicht nur um eine Variable.
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.

3_of_8 2. Nov 2007 22:19

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 04:59 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