2017-01-10 71 views
1

從C#的.NET我試圖與此簽名來的PInvoke從C++組件(源沒有訪問)方法內如何的PInvoke在C#的結構的數組另一個結構

result_code get_values(values_report_type *values_report) 

哪裏values_report是一個指向結構values_report_type的指針,其中包含我正在查詢哪些方法返回的值。該結構是這樣的:

typedef struct{ 
    int countOfValues; 
    values_type* values; 
    const char* name; 
} values_report_type; 

哪裏values是結構values_type陣列

這裏就是我會假設是問題:C++組件,我對工作讓我對values_type的含量比定義

typedef struct values_type_struct *values_type 

根據文檔此隱私是故意的其他任何信息結構。

所以,我的C#的PInvoke貌似現在這種權利:

[DllImport("MyLibrary.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)] 
internal static extern result_code get_values(out values_report_type values_report); 

internal struct values_report_type{ 
    int countOfValues; 
    IntPtr values; 
    string name; 
} 

這工作正常,並給了我一個指針values結構,但我需要的是訪問的values_type結構的陣列,並得到一個指向數組中每個項目的指針(每個項目的指針都是我需要的,因爲我沒有對結構內容的定義)。但我想不出一種方法來實現這一點,尤其是因爲圖書館對我的結構有限(甚至沒有給出長度)。在C++中,對於countOfValues定義的每個項目,它只是values_report.values[0]等等,但我不知道如何在將它編組爲.NET時使其工作。

有沒有辦法通過編組解決這個問題?

+0

'values'不是'struct'的數組。它是一個**指針**到'struct values_type_struct'的數組。你想用'values'中的元素做什麼?讀取'values [i]'很容易('IntPtr Value = Marshal.ReadIntPtr(values_report.values,i * IntPtr.Size)'),接下來發生的事情就不清楚了。 –

+0

我在unix操作系統上工作了很長時間,並多次閱讀了整個UNIX手冊。任何結構/數組您必須能夠確定每個記錄的結束位置。無論是通過固定大小的對象,結構中的length屬性,還是像'\ 0'這樣的終止字符。您的結構都是固定大小的對象,所以如果您想要一個數組,那麼只需在內存中跟隨另一個結構, \ 0' 。唯一的問題是,當countOfValues爲零時,它將看起來像'\ 0'。所以在數組的開始處,你可能想要添加你正在發送的數組的整數。 – jdweng

+0

@DavidHeffernan SDK中有更多方法使用指向'values_type_struct'元素的指針來執行計算。所以基本上,我無法查看結構的內容,但我可以將指針發送給另一個計算和轉換方法。 – koopaking3

回答

2

values不是結構數組。它是一個指針結構數組。

根據註釋和代碼,看起來你沒有定義結構本身。這就是所謂的不透明指針。您不需要知道結構大小,只需處理指向結構體的指針,然後將結果傳遞迴庫。

從這樣的陣列讀取所述不透明指針值:

IntPtr Value = Marshal.ReadIntPtr(values_report.values, i*IntPtr.Size); 

這獲得第i個

+0

我可能錯過了一些東西,但我沒有看到'values'是結構指針的數組。我只是看到它是'values_type *'類型。現在我的C/C++有點不成熟,但我認爲這是指向一個_single_'values_type'的指針,它可以用來表示一個'values_type'數組。指針數組不會被'values_type **'表示嗎? – Abion47

+0

'typedef struct values_type_struct * values_type'。所以'values_type'是指向struct的指針。 –

+0

啊,我明白了。我不習慣尋找typedefs。 :P – Abion47

相關問題