2013-05-17 36 views
1

我是vb.net的新手,試圖調用Delphi Dll來返回記錄。如果我在結構中放置三個整數,當我嘗試類似下面的代碼時,它會工作「我的方法的類型簽名不是PInvoke兼容的」..任何想法爲什麼我不能添加字節數組或者即使添加布爾值失敗。方法的類型簽名不是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

哪一部分引發錯誤? –

+0

什麼是DLL的聲明('getsysinfoF()'的Delphi或C聲明)? –

+0

@Douglas:顯然,試圖編譯''聲明失敗。 –

回答

3

實測值solultion .NET託管陣列是從在其它lanuages非託管陣列不同。您需要告訴PInvoke如何編組結構的數組字段,這取決於DLL如何首先分配和管理該數組。它是一個C風格的數組?一個Delphi風格的動態數組?一個ActiveX/COM SafeArray?這種信息需要使用MarshalAs屬性(顯然,.NET不支持Delphi風格的動態數組)包含在.NET端的結構的PInvoke聲明中。

參考MSND瞭解更多詳情:

Default Marshaling for Arrays

MarshalAsAttribute Class

更新:例如:

德爾福:

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 
+0

德爾福固定的256長度,這就是爲什麼我REDIM結構數組255 –

+0

以及建議的結構,我得到標識符的第一比符號 –

+0

小於預期@RandolBerry我固定的語法,但問題仍然是不完整的,因爲你還沒有告訴我們什麼該結構是。 –