所以我在这种情况下学会了使用 IntPtr,
-delphi(delphi 2006版)代码
function GetRequestResult(out code:integer):PChar; stdcall;
begin
LogMessage('GetRequestResult');
code:=requestCode;
result:=PChar(RequestResult);
LogMessage('GetRequestResult done');
end;
然后,为了在 C# 中使用, 我用过像,
IntPtr str = GetRequestResult(out code);
string loginResult = Marshal.PtrToStringAnsi(str);
这效果很好。
那么,这个案例怎么样?
-delphi代码
procedure Login(login,password:PChar); stdcall;
...
...
这个 PChar 位于 () 内部。 那么将字符串值传递给 Login delphi 函数的确切方法是什么?
[DllImport(“服务器工具”)]
private static extern void Login([MarshalAs(UnmanagementType.LPStr)]string id, [MarshalAs(UnmanagementType.LPStr)]string pass);
private static extern void Login(IntPtr id, IntPtr pass); //这样的话,后面怎么使用这个IntPtr呢?
private static extern void Login(string id, string pass);
提前致谢。
最佳答案
您的选项 3 是执行此操作的正确方法。 p/invoke 编码器会将 C# 字符串映射到指向以 null 结尾的字符数组的指针,即 PChar。默认调用约定是 stdcall,默认字符集是 Ansi,因此您不需要指定这些。
您的选项 1 也有效,但不必要地冗长,因为您只是重新声明默认编码。选项 2 也可以,但您只会给自己带来额外的工作。一旦 native 函数调用返回,您就有责任释放 IntPtr 值。
关于c# - 如何将 C# 字符串传递给 delphi .dll PChar 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11922074/