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

Delphi 7 PChar 與 C# StringBuilder 互操作字串封送指南

     編輯:程式設計疑難解答

問題背景

Delphi 7 開發 DLL,需將字串 (PChar/PAnsiChar) 傳遞給 C# 呼叫端,涉及字元集 (Ansi/Unicode) 封送問題。

Delphi 端定義

// Delphi 7 (Ansi 版本)
function GetString(out Buffer: PAnsiChar): Integer; stdcall;
  // 或
procedure FillString(Buffer: PAnsiChar; BufSize: Integer); stdcall;

C# 端正確封送

方案一:StringBuilder (推薦,可讀寫)

[DllImport("MyDelphi.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
static extern int GetString(StringBuilder buffer);

[DllImport("MyDelphi.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)]
static extern void FillString(StringBuilder buffer, int bufSize);

// 使用
var sb = new StringBuilder(256);
int len = GetString(sb); // 或 FillString(sb, sb.Capacity);
string result = sb.ToString();

方案二:String (僅限輸入,不可修改)

[DllImport("MyDelphi.dll", CharSet = CharSet.Ansi)]
static extern void InputOnlyString(string text); // Delphi 端 const PAnsiChar

方案三:IntPtr + Marshal (底層控制)

[DllImport("MyDelphi.dll", CharSet = CharSet.Ansi)]
static extern IntPtr GetStringPtr(); // Delphi 回傳 PAnsiChar

// 使用
IntPtr ptr = GetStringPtr();
string result = Marshal.PtrToStringAnsi(ptr);
// 若 Delphi 端需釋放記憶體,需配對呼叫 FreeString(ptr)

關鍵對照表

Delphi 類型C# 封送CharSet用途
PAnsiChar (輸入)stringAnsi唯讀傳入
PAnsiChar (輸出)StringBuilderAnsi可寫入緩衝區
PChar (D2009+ Unicode)StringBuilderUnicode雙向 Unicode
string (Delphi 長字串)不可直接跨 DLL-需轉 PAnsiChar/PWideChar

記憶體管理鐵律

  • 誰配置,誰釋放:Delphi 配置的記憶體需 Delphi 釋放,C# 勿嘗試 Marshal.FreeHGlobal
  • StringBuilder 由 C# 配置緩衝區,Delphi 僅寫入,安全
  • 固定大小緩衝區:C# 端 new StringBuilder(256),Delphi 端參數帶入 BufSize 防止溢位

Delphi 7 實作範例

procedure FillString(Buffer: PAnsiChar; BufSize: Integer); stdcall;
var
  Src: AnsiString;
begin
  Src := 'Hello from Delphi 7';
  if Length(Src) < BufSize then
    StrCopy(Buffer, PAnsiChar(Src))
  else
    StrLCopy(Buffer, PAnsiChar(Src), BufSize - 1);
end;
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved