從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時使其工作。
有沒有辦法通過編組解決這個問題?
'values'不是'struct'的數組。它是一個**指針**到'struct values_type_struct'的數組。你想用'values'中的元素做什麼?讀取'values [i]'很容易('IntPtr Value = Marshal.ReadIntPtr(values_report.values,i * IntPtr.Size)'),接下來發生的事情就不清楚了。 –
我在unix操作系統上工作了很長時間,並多次閱讀了整個UNIX手冊。任何結構/數組您必須能夠確定每個記錄的結束位置。無論是通過固定大小的對象,結構中的length屬性,還是像'\ 0'這樣的終止字符。您的結構都是固定大小的對象,所以如果您想要一個數組,那麼只需在內存中跟隨另一個結構, \ 0' 。唯一的問題是,當countOfValues爲零時,它將看起來像'\ 0'。所以在數組的開始處,你可能想要添加你正在發送的數組的整數。 – jdweng
@DavidHeffernan SDK中有更多方法使用指向'values_type_struct'元素的指針來執行計算。所以基本上,我無法查看結構的內容,但我可以將指針發送給另一個計算和轉換方法。 – koopaking3