【问题标题】:How to pass a widestring variable from Delphi to VB as string如何将宽字符串变量从 Delphi 传递到 VB 作为字符串
【发布时间】:2019-06-04 09:47:59
【问题描述】:

德尔福代码

procedure PassN1(out N1: widestring); stdcall;
begin
  N1 := 'A';
end;

exports
  PassN1;
end.

VB 代码

Private Declare Sub PassN1 Lib "C:\path.dll" Alias "PassN1" (<MarshalAs(UnmanagedType.BStr)> ByRef N1 As String)

...

Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
    Dim N1 = PassN1  'Expression does not produce a value.
    Try
        TabPage3.Text = N1
    Catch ex As Exception
    End Try
End Sub

我得到“表达式不产生值”。如何从 VB 中读取变量?

【问题讨论】:

  • 您的过程有一个您正确声明的输出参数。所以传递一个字符串变量作为参数,而不是期望从它没有的方法返回值。
  • 我该怎么做?
  • 如何将变量传递给方法? Dim s as string : PassN1(s)?
  • 第一次在VB中看到“:”语法。它有效,谢谢。如果需要,请正确发布答案,以便我将您的答案标记为正确。
  • : 只是为了让它可以放在一行上,这样它在我们不能有多行的注释中仍然是有效的代码。实际程序中不需要:

标签: vb.net delphi dll


【解决方案1】:

PassN1 是一个不返回值的过程。而是通过ByRef 参数返回字符串。像这样拨打Pass1

Dim N1 As String
PassN1(N1)
TabPage3.Text = N1

我还建议不要使用 Declare 关键字,该关键字现在主要出于兼容性原因而保留。像这样声明函数:

<DllImport("path/to/dll", CallingConvention:=CallingConvention.Stdcall)>
Private Sub PassN1(<MarshalAs(UnmanagedType.BStr)> ByRef N1 As String)
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-19
    • 2019-02-08
    相关资源
    最近更新 更多