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.
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.
Erstellt ein neues Buffer-Objekt.
BufferObj := Buffer(ByteAnzahl, FüllByte) BufferObj := Buffer.Call(ByteAnzahl, FüllByte)
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.
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.
Typ: Objekt
Diese Methode oder Funktion gibt ein Buffer-Objekt zurück.
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.
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.
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.
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
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")