C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: ポインタ配列をDLLでメモリを割り当てC#で使用したい


(過去ログ 111 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■65709 / inTopicNo.1)  ポインタ配列をDLLでメモリを割り当てC#で使用したい
  
□投稿者/ 巧克力 (1回)-(2013/03/14(Thu) 16:37:14)

分類:[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#を勉強不足なのが問題なのでしょうが、いろいろ調べてもどうしたらいいかわかりませんでした。

なにかアドバイスをいただけますようお願いいたします。
引用返信 編集キー/
■65713 / inTopicNo.2)  Re[1]: ポインタ配列をDLLでメモリを割り当てC#で使用したい
□投稿者/ Hongliang (44回)-(2013/03/14(Thu) 17:44:38)
IntPtr[]とref ST_BUFの組み合わせで問題なく動作しましたが。
DLL関数の呼び出しから返った後の処理とかに勘違いが含まれているかもしれません。

引用返信 編集キー/
■65722 / inTopicNo.3)  Re[2]: ポインタ配列をDLLでメモリを割り当てC#で使用したい
□投稿者/ 巧克力 (3回)-(2013/03/14(Thu) 21:34:36)
No65713 (Hongliang さん) に返信
> IntPtr[]とref ST_BUFの組み合わせで問題なく動作しましたが。
> DLL関数の呼び出しから返った後の処理とかに勘違いが含まれているかもしれません。

ご回答ありがとうございます。
問題なく動作しますか。
ということは、方法については間違っていないということですね。
他におかしなところがないか調べてみます。
結果がわかりましたら、報告いたします。
引用返信 編集キー/
■65996 / inTopicNo.4)  Re[3]: ポインタ配列をDLLでメモリを割り当てC#で使用したい
□投稿者/ 巧克力 (4回)-(2013/03/28(Thu) 10:24:41)
報告が遅くなりまして、申し訳ございません。

私自身では確認ができていないのですが、
上記方法で正常に動作したと別の者から報告がありました。
解決済みとさせていただきます。

ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -