Buffer-Objekt

class Buffer extends Object

Beansprucht einen Bereich des Speichers für erweiterte Techniken wie DllCall, Strukturen, StrPut und rohe Datei-Ein-/Ausgabe.

Buffer-Objekte werden typischerweise durch Aufruf von Buffer() erzeugt oder via FileRead mit der Option "RAW" zurückgegeben.

BufferObj := Buffer(ByteAnzahl)

ClipboardAll gibt einen Untertyp des Buffer-Objekts zurück, auch ClipboardAll genannt.

class ClipboardAll extends Buffer

"BufferObj" wird hier stellvertretend für ein beliebiges Buffer-Objekt verwendet, da "Buffer" die Klasse selbst ist.

Zusätzlich zu den von Object geerbten Methoden und Eigenschaften haben Buffer-Objekte die folgenden vordefinierten Eigenschaften.

Inhaltsverzeichnis

Buffer-ähnliche Objekte

Einige interne Funktionen akzeptieren ein Buffer-Objekt anstelle einer Adresse - im Abschnitt Siehe auch finden Sie die entsprechenden Links. Diese Funktionen akzeptieren auch andere Objekte mit einer Ptr- und Size-Eigenschaft, sind aber grundsätzlich für das native Buffer-Objekt optimiert.

In den meisten Fällen ist die Übergabe eines Buffer-Objekts wesentlich sicherer als die Übergabe einer Adresse, da die Funktion durch Lesen der Puffergröße verhindern kann, dass sie eventuell auf einen Speicherort außerhalb des Pufferspeichers zugreift. Anders verhält es sich mit DllCall, wenn es Funktionen außerhalb des Programms aufruft, dann kann es erforderlich sein, die Puffergröße explizit an die Funktion zu übergeben.

Statische Methoden

Call

Erstellt ein neues Buffer-Objekt.

BufferObj := Buffer(ByteAnzahl, FüllByte)
BufferObj := Buffer.Call(ByteAnzahl, FüllByte)

Parameter

ByteAnzahl

Typ: Integer

Anzahl der zu reservierenden Bytes. Äquivalent zu Buffer.Size.

Wenn weggelassen, wird das Buffer-Objekt mit einem Ptr von Null und einer Size von Null erstellt.

FüllByte

Typ: Integer

Geben Sie eine Zahl im Bereich von 0 bis 255 an, um jedes Byte im Pufferspeicher mit dieser Zahl zu füllen.

Dies sollte in der Regel weggelassen werden, wenn in den Pufferspeicher geschrieben wird, ohne ihn vorher zu lesen, da dies je nach Anzahl der Bytes die Performanz beeinträchtigt. Wenn weggelassen, wird der Pufferspeicher nicht initialisiert, d.h. jeder Byte enthält einen willkürlichen Wert.

Rückgabewert

Typ: Objekt

Diese Methode oder Funktion gibt ein Buffer-Objekt zurück.

Bemerkungen

Es wird ein MemoryError ausgelöst, wenn der Speicher nicht reserviert werden konnte, z.B. weil ByteAnzahl unerwartet groß ist oder das System nicht über genügend virtuellen Speicher verfügt.

Parameter sind durch __New definiert.

Methoden

__New

Reserviert den Pufferspeicher und füllt ihn optional mit Zahlen.

BufferObj.__New(ByteAnzahl, FüllByte)

Diese Methode existiert zur Unterstützung von Call und wird normalerweise nicht direkt aufgerufen. Siehe Konstruktion und Destruktion.

Geben Sie ByteAnzahl an, um den Pufferspeicher zu reservieren, neu zu reservieren oder freizugeben. Dies ist dasselbe wie, als würde man Size etwas zuweisen.

Geben Sie FüllByte an, um den Pufferspeicher mit dem angegebenen numerischen Byte-Wert zu füllen, was zur Folge hat, dass ein bereits vorhandener Inhalt überschrieben wird.

Wenn beide Parameter weggelassen werden, hat diese Methode keine Wirkung.

Eigenschaften

Ptr

Ruft die aktuelle Adresse des Pufferspeichers ab.

AktuellerPtr := BufferObj.Ptr

AktuellerPtr ist ein Integer, der die aktuelle Adresse des Pufferspeichers repräsentiert. Diese Adresse verliert ihre Gültigkeit, wenn der Pufferspeicher freigegeben oder neu reserviert wird. Ungültige Adressen dürfen nicht verwendet werden. Der Pufferspeicher wird erst freigegeben, wenn die Referenzanzahl des Buffer-Objekts auf 0 ist, aber er wird neu reserviert, wenn seine Größe geändert wird.

Size

Ermittelt oder setzt die Größe des Pufferspeichers (in Bytes).

AktuelleByteAnzahl := BufferObj.Size
BufferObj.Size := NeueByteAnzahl

AktuelleByteAnzahl und NeueByteAnzahl sind ein Integer, der die Größe des Pufferspeichers in Bytes repräsentiert. Die Adresse des Pufferspeichers ändert sich typischerweise, wenn seine Größe geändert wird. Wenn die Größe verringert wird, werden die Daten im Pufferspeicher gekürzt; die restlichen Bytes bleiben erhalten. Wenn die Größe erhöht wird, bleiben alle Daten erhalten und die Werte aller neuen Bytes werden willkürlich gesetzt (sie werden aus Performanzgründen nicht initialisiert).

Es wird ein MemoryError ausgelöst, wenn der Speicher nicht reserviert werden konnte, z.B. weil NeueByteAnzahl unerwartet groß ist oder das System nicht über genügend virtuellen Speicher verfügt.

AktuelleByteAnzahl ist immer genau der Wert, der entweder via __New oder durch eine vorherige Zuweisung zugewiesen wurde.

DllCall, NumPut, NumGet, StrPut, StrGet, File.RawRead, File.RawWrite, ClipboardAll

Beispiele

Verwendet ein Buffer-Objekt, um eine Zeichenkette von einer externen Funktion über DllCall zu empfangen.

max_chars := 11

; Pufferspeicher für die Unicode-Version von wsprintf reservieren.
bufW := Buffer(max_chars*2)

; UTF-16-Zeichenkette via wsprintfW() in den Pufferspeicher schreiben.
DllCall("wsprintfW", "Ptr", bufW, "Str", "0x%08x", "UInt", 4919, "CDecl")

; Zeichenkette aus bufW lesen und anzeigen.
MsgBox StrGet(bufW, "UTF-16")  ; Oder einfach nur StrGet(bufW).

; Pufferspeicher für die ANSI-Version von wsprintf reservieren.
bufA := Buffer(max_chars)

; ANSI-Zeichenkette via wsprintfA() in den Pufferspeicher schreiben.
DllCall("wsprintfA", "Ptr", bufA, "AStr", "0x%08x", "UInt", 4919, "CDecl")

; Zeichenkette aus bufA lesen (konvertiert ins native Format) und anzeigen.
MsgBox StrGet(bufA, "CP0")