Bufferオブジェクト

class Buffer extends Object

DllCall、構造体、StrPut、生のファイルI/Oなどの高度な技術で使用するために、メモリブロックをカプセル化します。

Bufferオブジェクトは、通常Buffer()を呼び出して作成しますが、FileReadで"RAW"オプションを付けて返すこともできます。

BufferObj := Buffer(ByteCount)

ClipboardAllは、BufferのサブタイプであるClipboardAllを返す。

class ClipboardAll extends Buffer

「Buffer」はクラスそのものなので、以下ではあらゆるBufferオブジェクトのプレースホルダとして 「BufferObj」を使用します。

Objectから継承されたメソッドやプロパティに加え、Bufferオブジェクトは以下の定義済みプロパティを持ちます。

目次

バッファ的オブジェクト

一部の組み込み関数では、アドレスの代わりにBufferオブジェクトを受け付けます - リンクについては関連セクションを参照してください。これらの関数は、PtrSizeプロパティを持つ他のオブジェクトも受け付けますが、ネイティブのBufferオブジェクトに最適化されています。

ほとんどの場合、Bufferオブジェクトを渡す方がアドレスを渡すよりも安全です。なぜなら、関数はバッファサイズを読み取ることで、バッファの外側のメモリ位置にアクセスしようとしないことを確認できるからです。例外として、DllCallがプログラム外の関数を呼び出す場合があります。その場合は、バッファサイズを関数に明示的に渡す必要がある場合があります。

静的メソッド

Call

新しいBufferオブジェクトを作成します。

BufferObj := Buffer(ByteCount, FillByte)
BufferObj := Buffer.Call(ByteCount, FillByte)

パラメータ

ByteCount

型:整数

割り当てるバイト数を指定します。Buffer.Sizeに対応します。

省略された場合、Buffer は NULL(ゼロ)PtrとゼロSizeで作成されます。

FillByte

型:整数

0~255の数値を指定すると、バッファ内の各バイトにその数値が設定されます。

バイト数に比例した時間的コストがかかるため、バッファを読み込まずに書き込むような場合には、一般に省略されるべきです。省略した場合、バッファのメモリは初期化されず、各バイトの値は任意です。

戻り値

型:オブジェクト

This method or function returns a Buffer object.

備考

ByteCountが予想外に大きい場合や、システムの仮想メモリが不足している場合など、メモリを確保できなかった場合はMemoryErrorがスローされます。

パラメータは__Newで定義します。

メソッド

__New

バッファの割り当てまたは再割り当てを行い、オプションでバッファを埋めます。

BufferObj.__New(ByteCount, FillByte)

このメソッドはCallをサポートするために存在し、通常、直接呼び出されることはありません。建設と破壊をご覧ください。

ByteCountを指定して、バッファの確保、再確保、解放を行う。これは、サイズを割り当てることと同じです。

FillByteを指定すると、与えられた数値のバイト値でバッファを満たし、既存の内容を上書きします。

両方のパラメータが省略された場合、このメソッドは何の効果もない。

プロパティ

Ptr

バッファの現在のメモリアドレスを取得します。

CurrentPtr := BufferObj.Ptr

CurrentPtr is an integer representing the buffer's current memory address. This address becomes invalid when the buffer is freed or reallocated. 無効なアドレスは使用しないでください。バッファはBufferオブジェクトの参照カウントが0になるまで解放されませんが、Sizeが変更されると再割り当てされます。

Size

バッファのサイズをバイト単位で取得または設定します。

CurrentByteCount := BufferObj.Size
BufferObj.Size := NewByteCount

CurrentByteCount and NewByteCount are an integer representing the buffer's size, in bytes. バッファのアドレスは通常、そのサイズが変更されるたびに変更されます。サイズが小さくなった場合、バッファ内のデータは切り捨てられますが、残りのバイトは保存されます。サイズが大きくなっても、すべてのデータは保存され、新しいバイトの値は任意です(パフォーマンス上の理由から、初期化されません)。

NewByteCountが予想外に大きい場合や、システムの仮想メモリが不足している場合など、メモリを確保できなかった場合はMemoryErrorがスローされます。

CurrentByteCount is always the exact value it was given either by __New or by a previous assignment.

DllCallNumPutNumGetStrPutStrGetFile.RawReadFile.RawWriteClipboardAll

Bufferを使って、DllCallで外部関数から文字列を受け取ります。

max_chars := 11

; Unicode 版 wsprintf で使用するためのバッファを確保します。
bufW := Buffer(max_chars*2)

; wsprintfW()でUTF-16文字列をバッファに出力します。
DllCall("wsprintfW", "Ptr", bufW, "Str", "0x%08x", "UInt", 4919, "CDecl")

; bufW から文字列を取り出し、表示します。
MsgBox StrGet(bufW, "UTF-16")  ; あるいは、StrGet(bufW)だけです。

; ANSI 版 wsprintf で使用するためのバッファを確保します。
bufA := Buffer(max_chars)

; wsprintfA()でANSI文字列をバッファに出力します。
DllCall("wsprintfA", "Ptr", bufA, "AStr", "0x%08x", "UInt", 4919, "CDecl")

; bufA から文字列を取得し(ネイティブ形式に変換)、表示します。
MsgBox StrGet(bufA, "CP0")