gpt4 book ai didi

vb.net - 方法的类型签名与 PInvoke 不兼容

转载 作者:行者123 更新时间:2023-12-03 19:42:40 29 4
gpt4 key购买 nike

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

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;

找到解决方案
Passing record as a function result from Delphi DLL to C++

最佳答案

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

详情请参阅 MSND:

Default Marshaling for Arrays

MarshalAsAttribute Class

更新:例如:

德尔福:

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

关于vb.net - 方法的类型签名与 PInvoke 不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16618528/

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