Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Speicherbereich in Bytearray schreiben (https://www.delphipraxis.net/92913-speicherbereich-bytearray-schreiben.html)

BenTech 28. Mai 2007 20:21


Speicherbereich in Bytearray schreiben
 
Hallo,
ich habe versucht über die DP-Suche eine Antwort auf meine Frage zu finde, hatte aber leider keinen Erfolg. Vor allem wusste ich nicht so recht, wonach ich genau suchen muss :?

Zu meiner Frage:
Ich habe den Pointer, der die Adresse eines "Packed Record"s angibt. Hinter dem Record stehen noch weitere Informationen, die ich nun auslesen möchte. Geplant war es so, dass ich die Daten in ein Byte Array schreibe, das ich dann weiter analysieren kann.
Ich habe, da ich bisher nicht viel mit direkten Speicherzugriffen gearbeitet habe, keine Ahnung, wie das funktioniert. Kann mir da eventuell jemand auf die Sprünge helfen? Ist bestimmt nicht schwer ;)

messie 28. Mai 2007 21:10

Re: Speicherbereich in Bytearray schreiben
 
Zitat:

Zitat von BenTech
Ich habe, da ich bisher nicht viel mit direkten Speicherzugriffen gearbeitet habe keine Ahnung, wie das funktioniert. Kann mir da eventuell jemand auf die Sprünge helfen? Ist bestimmt nicht schwer ;)

Doch, ist schwer! Die Speicherplätze werden vom Betriebssystem verwaltet und zugewiesen, Dein Programm kann dort also normalerweise nur über die Pointer zugreifen. Direkter Speicherzugriff ist unter XP das Verbotenste, was es gibt.

Du musst also Deine Inhalte in Variablen kopieren und dann untersuchen. Wenn Du den packed record kennst, sollte das eingentlich kein Problem sein...

Grüße, Messie

SirThornberry 28. Mai 2007 21:15

Re: Speicherbereich in Bytearray schreiben
 
eventuell ist das was du suchst ja ein typisierter Pointer.
Wenn du Beispielsweise folgenden packed Record hast:
Delphi-Quellcode:
type
  TYourRecord = packed record
    Daten1: XYZ;
    Daten2: YYZ;
  end;
so kannst du folgendermaßen einen typisierten Pointer erstellen und damit arbeiten:
Delphi-Quellcode:
var
  MyRecord: ^TYourRecord; //Einen Pointer der auf einen TYourRecord zeigt
begin
  MyRecord := DerPointerWelcherAufDenRecordZeigt;
  MyRecord^.Daten1 := irgendwas;
  MyRecord^.Daten2 := irgendwas;

BenTech 28. Mai 2007 21:37

Re: Speicherbereich in Bytearray schreiben
 
Zitat:

Doch, ist schwer! Die Speicherplätze werden vom Betriebssystem verwaltet und zugewiesen, Dein Programm kann dort also normalerweise nur über die Pointer zugreifen. Direkter Speicherzugriff ist unter XP das Verbotenste, was es gibt.
Hmm, es geht aber um Speicher, der von meinem Programm zuvor beschrieben wurde. Die Zusatzinfos stehen direkt hinter dem Record. Daher müsste es doch eigentlich gehen, dass ich nach dem Ende des Records die folgenden Speicherbereiche auslese.

Zitat:

eventuell ist das was du suchst ja ein typisierter Pointer.
Wenn du Beispielsweise folgenden packed Record hast
Das Problem ist, dass die Daten hinter dem Record unterschiedlich groß sein können. Im Record selber existiert ein Eintrag, aus dem man auslesen kann, wie groß der zusätzliche Bereich hinter diesem Record ist. Der Anhang hängt also vom Inhalt des Records ab.

Vielleicht hab ich mich auch etwas unglücklich ausgedrückt.
Ich habe den Pointer und die Länge des Records und die Länge des Anhangs. Ich müsste also lediglich den Speicherbereich ab dem Pointer bis zum Ende des Anhangs auslesen. Nur weiß ich nicht, wie das geht :(

bitsetter 28. Mai 2007 21:50

Re: Speicherbereich in Bytearray schreiben
 
Hi,

wenn du auf den Bereich hinter den Record zugreifen möchtest wäre dies eine Möglichkeit:
Delphi-Quellcode:
type
  TMyRecord = packed record
    Daten1: integer;
    Daten2: byte;
    ...
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  MyR: TMyRecord;
  pB: PByteArray;
begin
  pB:= Pointer(Cardinal(@MyR)+ SizeOf(TMyRecord));
  caption:= inttostr(pB^[0]);//DEMO
end;

BenTech 28. Mai 2007 22:54

Re: Speicherbereich in Bytearray schreiben
 
Ahh, vielen Dank. Das ist genau das, was ich gesucht habe :thumb:


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