Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将c字符串传递给delphi.dll PChar类型?_C#_Delphi_Pinvoke_Delphi 2006 - Fatal编程技术网

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

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;

所以我学会了在这种情况下使用IntPtr

-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); 
这很有效

那么这个案子呢?

-德尔菲代码

 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为您完成工作。