The DLL developed by Delphi Xe has two functions: test_returnpchar and test_returnpansichar:
Procedure movestr2pchar (const astr: widestring; const apchar: pwidechar; var apcharlen: integer); var oldlen: integer; slen: integer; begin oldlen: = apcharlen; slen: = length (astr); If apcharlen <slen + 1 then begin // requires the length plus the last #0 apcharlen: = slen + 1; Raise exception. createfmt (s_paramsizenotenough, ['apchar ', inttostr (oldlen), inttostr (slen + 1)]); end; // The number of returned characters, including the last #0 apcharlen: = slen + 1; move (astr [1], apchar ^, slen * 2); // write the final #0 pwidechar (INTEGER (apchar) + slen * 2) ^: = #0; end; Procedure moveansistr2pansichar (const astr: ansistring; const apchar: pansichar; var apcharlen: integer); var oldlen: integer; slen: integer; begin oldlen: = apcharlen; slen: = length (astr); If apcharlen <slen + 1 then begin // requires the length plus the last #0 apcharlen: = slen + 1; Raise exception. createfmt (s_paramsizenotenough, ['apchar ', inttostr (oldlen), inttostr (slen + 1)]); end; // The number of returned characters, including the last #0 apcharlen: = slen + 1; move (astr [1], apchar ^, slen); // write the final #0 pansichar (INTEGER (apchar) + slen) ^: = #0; end; function test_returnpchar (const apchar: pwidechar; var apcharlen: integer): hresult; var WS: widestring; begin result: = 0; try WS: = 'Software Co ., ltd. '; movestr2pchar (WS, apchar, apcharlen); expect t on E: exception do begin result: = 1000; g_lasterrormsg: = E. message; end; function test_returnpansichar (const apchar: pansichar; var apcharlen: integer): hresult; var S: ansistring; begin result: = 0; try s: = 'Software Co ., ltd. '; moveansistr2pansichar (S, apchar, apcharlen); expect t on E: exception do begin result: = 1000; g_lasterrormsg: = E. message; end;
That is, pass in a pwidechar/pansichar, and the function will modify its string.
In C #, because string is Unicode, pwidechar can be processed directly using string or stringbuilder. However, pansichar can only be processed using stringbuilder:
[DllImport("Stub.dll", EntryPoint = "Test_ReturnPChar", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern int Test_ReturnPChar([MarshalAs(UnmanagedType.LPWStr)]string APChar, ref int APCharLen);[DllImport("Stub.dll", EntryPoint = "Test_ReturnPAnsiChar", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]public static extern int Test_ReturnPAnsiChar([MarshalAs(UnmanagedType.LPStr)]StringBuilder APChar, ref int APCharLen);private void button1_Click(object sender, EventArgs e){ int len=1000; string s=new string((char)0,len); yjDllImport_TMTS.Test_ReturnPChar(s, ref len); MessageBox.Show(s); len = 1000; //string s2 = new string((char)0, l); StringBuilder sb = new StringBuilder(len); yjDllImport_TMTS.Test_ReturnPAnsiChar(sb, ref len); MessageBox.Show(sb.ToString());}