c# - 如何将 C# 字符串传递给 delphi .dll PChar 类型?

标签 c# delphi pinvoke delphi-2006

所以我在这种情况下学会了使用 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(“服务器工具”)]

  1. private static extern void Login([MarshalAs(UnmanagementType.LPStr)]string id, [MarshalAs(UnmanagementType.LPStr)]string pass);

  2. private static extern void Login(IntPtr id, IntPtr pass); //这样的话,后面怎么使用这个IntPtr呢?

  3. 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/

相关文章:

delphi - 为 Mock 提供数据以进行单元测试

c# - 如何从 C++ dll 在 C# 函数中传递大小未知的数组?

c# - 使用linq将几个列表合并为一个

c# - Odata如何授权用户角色的$expand功能?

delphi - 如何在 XE8 中禁用 Castalia?

delphi - 成功关闭应用程序后的 AV

C# 和 Ghostscript 64 位

c# - 我们如何复制两个均由 Marshal.AllocHGlobal 分配的缓冲区?

c# - 使用 "not in"子句连接两个以上的表

c# - 在 WCF 项目中放置常量的位置