我是vb.net的新手并试图调用返回记录的Delphi Dll。如果我在结构中放置三个整数,当我尝试类似下面的代码时,我会得到“方法的类型签名不兼容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()
的Delphi
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;
发现了解决方案 Passing record as a function result from Delphi DLL to C++
答案 0 :(得分:3)
.NET托管阵列与其他语言中的非托管阵列不同。您需要告诉PInvoke如何编组结构的数组字段,这取决于DLL如何首先分配和管理该数组。它是C风格的阵列吗?一个Delphi风格的动态数组? ActiveX / COM SafeArray?这种信息需要使用MarshalAs
属性包含在.NET端的结构的PInvoke声明中(显然,.NET不支持Delphi风格的动态数组)。
有关详细信息,请参阅MSND:
更新:例如:
的Delphi:
type
SysInfo = record
iPrtRes: Integer;
iMaxRips: Integer;
iUnits: Integer;
str: array[0..255] of Byte;
end;
.NET:
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