2012-01-26 62 views
1

我使用已經方法限定爲API如下:當我通過pinvoke獲得第一個元素時,如何獲得數組中的下一個項目?

[DllImport("icsneo40.dll")] 
public static extern Int32 icsneoGetMessages(Int32 hObject, ref icsSpyMessage pMsg, ref   Int32 pNumberOfMessages, ref Int32 pNumberOfErrors); 

icsSpyMessage參數描述爲:

PMSG [OUT]
這是一個陣列的所述第一元素的地址 icsSpyMessage結構。該陣列將加載由硬件收到的 消息。此數組必須大小,以適合 20000 icsSpyMessage結構

我的問題是如何訪問數組中的其他元素,當所有我是第一個元素?

回答

3

因爲你是傳遞一個數組,你應該申報icsSpyMessage是一個數組:

[DllImport("icsneo40.dll")] 
public static extern Int32 icsneoGetMessages(
    Int32 hObject, 
    [Out] icsSpyMessage[] pMsg, 
    ref Int32 pNumberOfMessages, 
    ref Int32 pNumberOfErrors 
); 

的[出]屬性指示的P/Invoke編組當元帥的本地內存回你的管理結構的數組。編組器將根據託管數組的長度編組元素。

所以你需要在調用函數之前分配這個數組。您所調用的API要求您提供至少20,000個元素的數組。

icsSpyMessage[] pMsg = new icsSpyMessage[20000]; 
Int32 result = icsneoGetMessages(hObject, pMsg, 
    ref pNumberOfMessages, ref pNumberOfErrors); 
0

像這樣:

[DllImport("icsneo40.dll")] 

public static extern Int32 icsneoGetMessages(
    Int32 hObject, 
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)] 
    out icsSpyMessage[] pMsg, 
    ref Int32 pNumberOfMessages, 
    ref Int32 pNumberOfErrors 
); 
+0

這是不正確。它不應該使用' out'參數,應該被刪除,相反你需要'[out]'屬性,看看我的答案,並且在發生時不需要'MarshalAs',因爲默認行爲是編組整個數組。由於性能原因,SizeParamIndex可能很有價值。 –

0

爲什麼複雜的事情?所有這些都是指向某種結構或結構數組的指針。因此,聲明您的20k大小的數組

icsSpyMessage myMessages [20000];

其傳遞給該方法如下:

INT結果= icsneoGetMessages( blahh, myMessages [0],// < < ==這是一個指向的結構或物體的第一元件... blahh, blahh);

當你得到消息,你可以通過「的foreach遍歷(在myMessages icsSpyMessage項){...}

希望這有助於..

相關問題