Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/332.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.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#调用此delphi.dll函数?_C#_Delphi_Pinvoke - Fatal编程技术网

如何从C#调用此delphi.dll函数?

如何从C#调用此delphi.dll函数?,c#,delphi,pinvoke,C#,Delphi,Pinvoke,//delphi代码(delphi版本:turbodelphiexplorer(它是delphi2006)) //使用上述delphi函数的C#代码(我使用的是unity3d,内,C#) 在C#中使用该函数的正确方法是什么 (对于在delphi中使用,代码如下所示, 如果(event=1)和(tag=10),则writeln('Login result:',GetLoginResult);)字符串的内存由您的Delphi代码拥有,但您的p/invoke代码将导致封送员在该内存上调用CoTaskM

//delphi代码(delphi版本:turbodelphiexplorer(它是delphi2006))

//使用上述delphi函数的C#代码(我使用的是unity3d,内,C#)

在C#中使用该函数的正确方法是什么

(对于在delphi中使用,代码如下所示,
如果(event=1)和(tag=10),则writeln('Login result:',GetLoginResult);)

字符串的内存由您的Delphi代码拥有,但您的p/invoke代码将导致封送员在该内存上调用
CoTaskMemFree

您需要做的是告诉封送员,它不应该承担释放内存的责任

[DllImport ("ServerTool")] 
private static extern IntPtr GetLoginResult();
然后使用
Marshal.PtrToStringAnsi()
将返回值转换为C字符串

您还应该通过将Delphi函数声明为
stdcall
,确保调用约定匹配:

function GetLoginResult: PChar; stdcall;
尽管这种调用约定的不匹配对于没有参数和指针大小的返回值的函数来说并不重要


为了让这一切顺利进行,Delphi字符串变量
LoginResult
必须是一个全局变量,以便其内容在
GetLoginResult
返回后有效。

可能会有帮助:在这种情况下调用约定也会起作用吗?@Petesh事实上不会,因为函数没有参数,并且返回值对stdcall和register处理相同。但最好将Delphi函数声明为stdcall。谢谢。我很确定,如果您将DllImport函数的返回值定义为字符串,封送员将按照msdn()中的描述正确处理它。@Stefan发生的情况是封送员对您返回的指针调用
CoTaskMemFree
。@DavidHeffernan感谢您的回复,但这会发生错误。。。请参见此错误图片,
[DllImport ("ServerTool")] 
private static extern IntPtr GetLoginResult();
IntPtr str = GetLoginResult();
string loginResult = Marshal.PtrToStringAnsi(str);
function GetLoginResult: PChar; stdcall;