この質問をする方法がわかったので、ここで新しい質問を作成していますが、私はまだ PInvoke の初心者です。
次の構造を持つC APIがあります。
typedef union pu
{
struct dpos d;
struct epo e;
struct bpos b;
struct spos c;
} PosT ;
typedef struct dpos
{
int id;
char id2[6];
int num;
char code[10];
char type[3];
} DPosT ;
および次の API 関数:
int addPos(..., PosT ***posArray,...)
これをCで次のように呼び出す方法:
int main(int argc, const char *argv[])
{
...
PosT **posArray = NULL;
...
ret_sts = addPos(..., &posArray, ...);
...
}
addPos() 内のメモリは posArray に割り当てられ、データも取り込まれます。割り当ては calloc を使用して次のようになります。
int addPos(..., PosT ***posArray, ...)
{
PosT **ptr;
...
*posArray = (PosT **) calloc(size, sizeof(PosT *));
*ptr = (PosT *)calloc(...);
...
(*posArray)[(*cntr)++] = *ptr;
...
/* Population */
...
}
そのメモリの割り当てを解除するために呼び出される別の関数があります。
今、私はC#で同じことをしたいのですが、
C# クラスでこれを作成しました。
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct DPositionT
{
public int Id;
[MarshalAs(UnmanagedType.LPStr, SizeConst = Constants.Id2Len)]
public string Id2;
public int Num;
[MarshalAs(UnmanagedType.LPStr, SizeConst = Constants.CodeLen)]
public string Code;
[MarshalAs(UnmanagedType.LPStr, SizeConst = Constants.TypeLen)]
public string type;
}
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Explicit )]
struct PosT
{
[System.Runtime.InteropServices.FieldOffset(0)]
DPosT d;
};
クライアントコードで共用体のこのメンバーのみを使用するため、d のみを定義しました。
addPos() を呼び出すには、 posArray をどのように作成して渡す必要がありますか?
あなたの助けは非常に高く評価されています.