gpt4 book ai didi

.net - 将字符串从 Delphi dll 传递到 .net

转载 作者:行者123 更新时间:2023-12-03 15:42:09 25 4
gpt4 key购买 nike

我已经搜索了很多关于这个问题的信息,并且没有关于如何将字符串从delphi dll传递到.NET的明确答案接下来的代码基于msdn帮助文件:http://msdn.microsoft.com/en-us/library/4zey12w5.aspx

//Delphi code

function myDelphiFunc(var Buffer: PChar): Integer; export; stdcall;
Buffer:='this is a test';
Return:=0;
end;

//vb.NET code

<DllImport(path)> _
Public Function myDelphiFunc(ByVal buffer As String) As Integer

Public Sub myNETFunc()
Dim buffer_size As integer = 25
Dim buffer As String = New String(CChar(" "), buffer_size )
Call myDelphiFunc(buffer)
MsgBox(Strings.Left(buffer, InStr(buffer, Chr(0)) - 1))
End Sub

调用 myDelphiFunc 时,我在“buffer”变量中收到一个空字符串。我做错了什么?

提前致谢

最佳答案

你的代码有很多问题。主要故障有:

  • Delphi 函数通过引用接收指针,但 VB 代码通过值传递它。
  • Delphi 代码需要将字符串复制到提供的缓冲区中。
  • Delphi 代码应使用 PAnsiChar 来匹配 VB。或者 p/invoke 上的 PWideChar 和 CharSet.Unicode。
  • VB 代码需要使用 StringBuilder 而不是 String 才能将字符串编码回调用方。
  • 该函数需要接受长度参数以避免缓冲区溢出。

但是,我不确定是否值得尝试太深入地理解它。最简单的方法是使用在共享 COM 堆上分配的 BSTR。这使得该函数更易于使用,并隐藏了所有内存分配的复杂性。

德尔福

procedure TestFunc(out str: WideString); stdcall;
begin
str := 'foo';
end;

VB

<DllImport(path)> _ 
Public Sub TestFunc(<MarshalAs(UnmanagedType.BStr)> ByRef str As String)

关于.net - 将字符串从 Delphi dll 传递到 .net,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17789091/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com