1

我是 vb.net 的新手,并试图调用返回记录的 Delphi Dll。如果我在 struct 中放入三个整数,当我尝试类似下面的代码时它会起作用,我会得到“方法的类型签名与 PInvoke 不兼容”。关于为什么我不能添加字节数组或者即使我添加布尔值它也会失败的任何想法。

Public Structure SysInfo
    Public iPrtRes As Integer
    Public iMaxRips As Integer
    Public iUnits As Integer
    Public str As Byte()
End Structure

<DllImport("C:\project2.DLL", CallingConvention:=CallingConvention.Cdecl)>
Public Function getsysinfoF() As SysInfo
End Function

Dim theSysInfoRec As SysInfo
ReDim theSysInfoRec.str(255)

theSysInfoRec = getsysinfoF()

德尔福

type
  SysInfo = record
    iPrtRes: Integer;
    iMaxRips: Integer;
    iUnits: Integer;
    str: array[0..255] of Byte;
  end;

function getsysinfoF() : SysInfo; cDecl
begin
  result.iPrtRes := 400;
  result.iMaxRips := 300;
  result.iUnits := 200;
  result.str[0] := $ff;
end;

将记录作为函数结果从 Delphi DLL 传递到 C++中找到解决方案

4

1 回答 1

3

.NET 托管数组不同于其他语言中的非托管数组。您需要告诉 PInvoke 如何编组结构的数组字段,这首先取决于 DLL 如何分配和管理该数组。它是 C 风格的数组吗?Delphi 风格的动态数组?ActiveX/COM SafeArray?此类信息需要包含在 .NET 端使用MarshalAs属性的结构的 PInvoke 声明中(显然,.NET 不支持 Delphi 样式的动态数组)。

详情请参阅 MSND:

数组的默认封送处理

MarshalAsAttribute 类

更新:例如:

德尔福:

type
  SysInfo = record
    iPrtRes: Integer;
    iMaxRips: Integer;
    iUnits: Integer;
    str: array[0..255] of Byte;
  end;

。网:

Public Structure <StructLayout(LayoutKind.Sequential)> SysInfo
    Public iPrtRes As Integer
    Public iMaxRips As Integer
    Public iUnits As Integer
    <MarshalAs(UnmanagedType.ByValArray, SizeConst := 256)>
    Public str() As Byte
End Structure
于 2013-05-17T22:15:57.303 回答