TMarshaller (記錄型別) 基於 TMarshal (靜態類別方法) 實現,提供自動記憶體管理的安全緩衝區操作,徹底簡化非受控記憶體、字串編碼轉換等底層任務。
| 特性 | TMarshaller | TMarshal |
|---|---|---|
| 型別 | 記錄型別 (Record) | 類別 (Class) - 靜態方法 |
| 記憶體管理 | 自動 (離開作用域釋放) | 手動 |
| 核心優勢 | RAII 風格,防洩漏 | 提供 Copy 等額外實用方法 |
{測試}
procedure TForm1.FormCreate(Sender: TObject);
var
M: TMarshaller;
pw: TPtrWrapper;
str: string;
bs: TBytes;
begin
bs := BytesOf('萬一的 Delphi 博客');
{ 1. 配置非受控記憶體並複製位元組陣列 }
pw := M.AllocMem(Length(bs));
TMarshal.Copy(bs, 0, pw, Length(bs)); { TMarshal.Copy: 來源、來源索引、目標指標、長度 }
{ 2. 以 ANSI 讀取 }
str := TMarshal.ReadStringAsAnsi(pw);
ShowMessage(str);
{ 3. 以 UTF-8 寫入並讀回 }
pw := M.AsUtf8(str); { 自動配置並寫入 UTF-8 位元組 }
str := TMarshal.ReadStringAsUtf8(pw, -1); { -1 表示以 Null 結尾 }
ShowMessage(str);
end;
TMarshaller.AllocMem(Size):配置非受控記憶體,自動釋放TMarshaller.AsUtf8(String):字串轉 UTF-8 位元組並配置記憶體TMarshaller.AsAnsi(String):字串轉 ANSI 位元組TMarshal.Copy(Src, SrcIdx, Dest, Count):高效位元組複製TMarshal.ReadStringAsAnsi/Utf8/Unicode(Ptr, Len):從指標讀取字串TMarshal.PtrToStringAnsi/Utf8/Unicode(Ptr):便捷讀取TMarshaller 為記錄型別,離開作用域自動呼叫 FreeMem,杜絕洩漏WideCharToMultiByteTPtrWrapper 替代 Pointer,64 位元無憂現代 Delphi 專案應全面採用 TMarshaller/TMarshal 處理非受控記憶體與編碼轉換,告別手動 GetMem/FreeMem 時代。