Delphi 7 開發 DLL,需將字串 (PChar/PAnsiChar) 傳遞給 C# 呼叫端,涉及字元集 (Ansi/Unicode) 封送問題。
// Delphi 7 (Ansi 版本)
function GetString(out Buffer: PAnsiChar): Integer; stdcall;
// 或
procedure FillString(Buffer: PAnsiChar; BufSize: Integer); stdcall;
[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();
[DllImport("MyDelphi.dll", CharSet = CharSet.Ansi)]
static extern void InputOnlyString(string text); // Delphi 端 const PAnsiChar
[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 (輸入) | string | Ansi | 唯讀傳入 |
PAnsiChar (輸出) | StringBuilder | Ansi | 可寫入緩衝區 |
PChar (D2009+ Unicode) | StringBuilder | Unicode | 雙向 Unicode |
string (Delphi 長字串) | 不可直接跨 DLL | - | 需轉 PAnsiChar/PWideChar |
Marshal.FreeHGlobalStringBuilder 由 C# 配置緩衝區,Delphi 僅寫入,安全new StringBuilder(256),Delphi 端參數帶入 BufSize 防止溢位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;