2012-01-06 17 views
2

構造体の配列がPInvokeから返され、structにint型またはfloat型が含まれていても配列が返されます。私は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#コードの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) 
} 

答えて

4

アンマネージコードの文字配列は単なる文字列なので、ここでは2つのオプションがあります。どちらあなたが使用することは、実際にはC#の-landに戻っていたときに文字データを使用する必要がある方法によって異なります。

  1. 元帥それ配列として。 (:これは私が最初に示されているようにByValArray、ないLPArrayする必要があります。おかげで@Hans EDIT):構造に埋め込まれた配列が整列化取得方法についてはthis articleを参照してください

    [StructLayout(LayoutKind.Sequential)] 
    public struct return_part { 
        public int partid; 
        public int numcomp; 
        public int parttype; 
        [MarshalAs(UnmanagedType.ByValArray, SizeConst=100)] 
        public char[] partname; 
    }; 
    
  2. 元帥、それを文字列として。構造体に含まれる文字列を整列化する方法については、this articleを参照してください。

    [StructLayout(LayoutKind.Sequential)] 
    public struct return_part { 
        public int partid; 
        public int numcomp; 
        public int parttype; 
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst=100)] 
        public string partname; 
    }; 
    
+0

LPArrayは* CHARにそれを回すこと、正しくない、[]チャーありません。 2番目のスニペットは良いです。 –

+0

2人目は素晴らしい、ありがとう。 – user978281

+0

私の間違い、あなたは正しいです。配列/ポインタの等価性は、構造体に埋め込まれていない関数パラメータでのみ真です。それを修正するための編集。 –

1

は、あなたの構造がて、partnameとして単一の文字を持っています。次のいずれかを試してください:

char[] partname; //-- A character array 

byte[] partname; //-- A byte array 

string partname; //-- A string 

これが機能する場合は、文字列を好む傾向があります。 C#の文字は実際には1つの文字(意図された使用)を表し、Cの文字は実際には存在しないため(符号なし整数型)。