|
分類:[C#]
はじめて投稿させていただきます。
C++で作成されたDLLを使用してC#で以下のことを実現させたいと考えています。
・DLLでメモリを確保する ・確保されたアドレスにDLLからデータを転送させる ・C#側で転送されたデータをファイルに保存する
DLLでは以下の構造体が宣言されています。
typedef struct _ST__BUF { cha *m_puBuffAddress[5] } ST_BUF
他にもメンバーがいますが、省いています。
以下の関数で領域を確保しています。
static char *g_pGlobal[5]; long _stdcall Open(ST_BUF *pstBuf) { for (int i = 0; i < 5; i++) { g_pGlobal[i] = new char[1024]; if (g_pGlobal[i]) { pstBuf->m_puBuffAddress[i] = g_pGlobal[i]; } }
return 0; }
これをC#側から呼び出すにはどのようにすればいいのかわからず困っております。
C#側での宣言は以下の2つの方法のどちらかで可能だと思っています。
1)unsafeで宣言 [StructLayout(LayoutKind.Sequential)] unsafe public struct ST_DTU_RCV_DMA_BUF { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public byte*[] m_puBuffAddress; };
2)IntPtrで宣言 [StructLayout(LayoutKind.Sequential)] public struct ST_DTU_RCV_DMA_BUF { [MarshalAs(UnmanagedType.ByValArray, SizeConst = 5)] public IntPtr[] m_puBuffAddress; };
関数の宣言は以下の2通りを試しました。
public static extern int Open(ref ST__BUF pstBuf); public static extern int Open([Out] ST__BUF pstBuf);
しかし、どのパターンでも確保された領域にアクセスできません。 ウォッチで見ても中身が空です。 アドレスもDLLで確保されたものとは別のアドレスになっています。
C#を勉強不足なのが問題なのでしょうが、いろいろ調べてもどうしたらいいかわかりませんでした。
なにかアドバイスをいただけますようお願いいたします。
|