我有一個從PInvoke返回的結構數組,如果結構只包含int或float,但它返回數組,但是當我嘗試返回數組char它開始變得凌亂,我試圖返回一個IntPtr,但那並沒有成功。任何想法如何我可以得到這個工作?用PInvoke返回一個包含char []的結構數組
C代碼
struct return_part {
int partid;
int numcomp;
int parttype;
char partname[100];
};
extern int return_parts(return_part ** array, int * arraySizeInElements) {
int partcount = 0;
struct list_part *currentnode;
currentnode = head;
struct section_list *section;
struct return_part *temppart;
while (currentnode != NULL) {
partcount++;
currentnode = currentnode->next;
}
currentnode = head;
*arraySizeInElements = partcount;
int bytesToAlloc = sizeof(return_part) * (*arraySizeInElements);
return_part * a = static_cast<return_part *>(CoTaskMemAlloc(bytesToAlloc));
*array = a;
int q = 0;
while (currentnode != NULL) {
struct return_part tmp;
tmp.partid = currentnode->partid;
tmp.numcomp = currentnode->numcomp;
strcpy(tmp.partname, currentnode->partname);
tmp.parttype = currentnode->parttype;
a[q] = tmp;
q++;
currentnode = currentnode->next;
}
return 0;
}
C#代碼
[StructLayout(LayoutKind.Sequential)]
public struct return_part {
public int partid;
public int numcomp;
public int parttype;
public char partname;
};
internal static class UnsafeNativeMethods
{
[DllImport(_dllLocation, CallingConvention = CallingConvention.Cdecl)]
public static extern int return_parts([MarshalAs(UnmanagedType.LPArray,
SizeParamIndex = 1)] out return_part[] array, out int arraySizeInElements);
}
public static ReturnPoint[] getpoints(int partid) {
return_parts[] parts;
int size;
int result = UnsafeNativeMethods.return_parts(out parts, out size)
}
LPArray是不正確的,即它變成字符*,不是char []。第二個片段很好。 – 2012-01-06 15:55:52
第二個工作很好,謝謝。 – user978281 2012-01-06 19:55:48
我的錯誤,你是對的;數組/指針等價僅在函數參數中是真實的,而不是嵌入到結構中。編輯來解決這個問題。 – 2012-01-06 21:15:57