C# 如何将c字符串传递给delphi.dll PChar类型?
所以我学会了在这种情况下使用IntPtr -delphi 2006版本代码C# 如何将c字符串传递给delphi.dll PChar类型?,c#,delphi,pinvoke,delphi-2006,C#,Delphi,Pinvoke,Delphi 2006,所以我学会了在这种情况下使用IntPtr -delphi 2006版本代码 function GetRequestResult(out code:integer):PChar; stdcall; begin LogMessage('GetRequestResult'); code:=requestCode; result:=PChar(RequestResult); LogMessage('GetRequestResult done'); end;
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);
这很有效
那么这个案子呢?
-德尔菲代码
procedure Login(login,password:PChar); stdcall;
...
...
这个PChar在里面。
那个么,将字符串值传递给登录delphi函数的确切方式是什么呢
[DllImport服务器工具]
私有静态外部无效登录[MarshalAsUnmanagedType.LPStr]字符串id,[MarshalAsUnmanagedType.LPStr]字符串传递
私有静态外部无效登录PTR id,IntPtr通行证;
//在这种情况下,如何在后面的部分中使用此IntPtr
私有静态外部无效登录字符串id,字符串传递
提前感谢。您可以使用:Marshal.StringToHGlobalAnsi 您可以使用:Marshal.StringToHGlobalAnsi 您的选项3是正确的方法。p/invoke封送拆收器将C字符串映射到指向以null结尾的字符数组(即PChar)的指针。默认的调用约定是stdcall,默认的字符集是Ansi,因此不需要指定它们
您的选项1也可以工作,但不必要地冗长,因为您只是重新声明默认编组。选择2也可以,但你只是在为自己创造额外的工作。一旦本机函数调用返回,您就有责任释放IntPtr值。您的选项3是正确的方法。p/invoke封送拆收器将C字符串映射到指向以null结尾的字符数组(即PChar)的指针。默认的调用约定是stdcall,默认的字符集是Ansi,因此不需要指定它们
您的选项1也可以工作,但不必要地冗长,因为您只是重新声明默认编组。选择2也可以,但你只是在为自己创造额外的工作。一旦本机函数调用返回,您就有责任释放IntPtr值。什么delphi版本?由于这主要是一个C问题,我建议您只参考PAnsiChar,它总是相当于C中的char*type,无论stackoverflow上的Delphi版本如何,如果底层DLL是Delphi 7 DLL或XE,那么您上面列出的签名将具有两种不同的含义。什么Delphi版本?由于这主要是一个C问题,我建议您只参考PAnsiChar,它总是相当于C中的char*type,无论stackoverflow上的Delphi版本如何,如果底层DLL是Delphi 7 DLL或XE,那么您上面列出的签名将具有两种不同的含义。虽然您可以这样做,完成后,您必须释放HGlobal。更容易让p/invoke marshaller为您完成这项工作。虽然您可以这样做,但您必须在完成后释放HGlobal。更容易让p/invoke marshaller为您完成工作。