首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 字串與 Windows API 互操作:PChar、緩衝區、記憶體管理完整指南

     編輯:Delphi

Delphi 字串傳遞給 Windows API 的四大模式與取值三大策略

Windows API 以 PChar (即 PAnsiChar) 為標準字串介面。Delphi 的 string (AnsiString/UnicodeString) 記憶體布局與之兼容,但正確的賦值、取值、記憶體管理模式至關重要,關係到穩定性與效能。

賦值模式:四種將 Delphi 字串傳給 API 的方式

模式 1:直接字面值 (最簡單)


SetWindowText(Handle, '新標題');  // 編譯器自動生成 PChar 字面值

模式 2:變數聲明為 PChar


var
  p: PChar;
begin
  p := '新標題';       // 隱式轉換:字面值 → PChar
  SetWindowText(Handle, p);
end;

模式 3:string 臨時轉型 (最常用)


var
  str: string;
begin
  str := '新標題';
  SetWindowText(Handle, PChar(str));  // 取得內部緩衝區指標
end;

模式 4:靜態字元陣列 (固定緩衝區)


var
  arr: array[0..255] of Char;
begin
  arr := '新標題';    // 自動補 #0 結尾
  SetWindowText(Handle, arr);  // 陣列名即指標
end;

取值模式:三種從 API 獲取字串的策略

策略 1:靜態陣列緩衝區 (最安全、最常用)


var
  arr: array[0..254] of Char;  // 預留 1 字元給 #0
begin
  GetWindowText(Handle, arr, 255);  // API 填充緩衝區
  ShowMessage(arr);  // 自動按 #0 截斷
end;

策略 2:GetMem 動態分配 PChar


var
  p: PChar;
begin
  GetMem(p, 255);           // 分配 255 位元組
  try
    GetWindowText(Handle, p, 255);
    ShowMessage(p);
  finally
    FreeMem(p);             // 必須手動釋放
  end;
end;

策略 3:GlobalAlloc 全域記憶體 (較慢,需跨模組共享時使用)


var
  hMem: HGLOBAL;
begin
  hMem := GlobalAlloc(GMEM_FIXED, 255);  // GMEM_FIXED = 0
  try
    GetWindowText(Handle, PChar(hMem), 255);
    ShowMessage(PChar(hMem));
  finally
    GlobalFree(hMem);
  end;
end;

策略 4:直接使用 string (需預設長度 + 修剪)


var
  str: string;
begin
  SetLength(str, 255);              // 1. 預分配緩衝區
  GetWindowText(Handle, PChar(str), 255);
  str := PChar(str);                // 2. 利用 #0 截斷還原實際長度
  ShowMessage(str);
end;

定長字串 String[n] 與 API 的不兼容性


var
  s: String[20];
begin
  s := 'Hello';
  // s 內存佈局:[Length:Byte][Chars...] 無 #0 結尾
  // 傳給 API 會讀越界 → 嚴重錯誤
  // 解決:轉為 PChar 或使用 ShortString 配合 StrPCopy
end;

記憶體管理決策表

Unicode 時代 (Delphi 2009+) 的關鍵變化

  • string = UnicodeString,Char = WideChar,PChar = PWideChar
  • 呼叫 ANSI API (結尾 A) 時:PAnsiChar(AnsiString(str))
  • 呼叫 Unicode API (結尾 W) 時:PWideChar(str) 直接可用
  • 緩衝區大小以 **字元數** 計算,但 API 參數多為 **位元組數**,注意 SizeOf(Char) 差異

掌握這四種賦值與三種取值模式,並根據場景選擇記憶體策略,是 Delphi 與 Windows API 高效互操作的核心功力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景推薦方式關鍵點
短字串、已知最大長度靜態陣列 array[0..N] of Char棧上分配、無洩漏風險、速度最快
長度未知、可能很大string + SetLength + PChar自動管理、支援 Unicode、Delphi 2009+ 首選
跨 DLL/進程共享GlobalAlloc / Shared Memory需手動管理、效能較差
高頻調用、極致效能GetMem/FreeMem + PChar避免 string 參考計數開銷