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

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

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

Re[5]: C#からC/C++のDLL関数を呼び出したい


(過去ログ 61 を表示中)

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

■35167 / inTopicNo.1)  C#からC/C++のDLL関数を呼び出したい
  
□投稿者/ うず (5回)-(2009/04/21(Tue) 14:35:11)

分類:[C#] 

C#から、C/C++のDLL関数を呼び出したいです。
以下のようなケースで、C/C++のDLL関数を呼び出すための記述方が分かりません。
ご教示いただきますようお願いします。

1. DLL側の関数で、BYTE* を引数とする関数があり、それを使用したいです。
BYTE型のバッファ(呼び出し側であらかじめ確保しておく)を引数とし
DLL側の関数を呼び出すと、そのDLL側の関数に値をコピーするといったイメージです。

2. DLL側の関数ではこのようになっています
  int GetData (BYTE* arg_Buf)
   {
       memcpy(arg_Buf, m_OutputBuf, BufferSize); // BufferSize = 100
   }

3. C#側での宣言は以下のようにしました
   [DllImport("DataCopy.dll")]
   static extern int GetData (ref byte [] arg_Buf);   

4. 実際の使用時にはこうしました
   byte[] pucImgOut = new byte[100];
  GetData(ref OutBuf);

プログラム実行時、4.の関数GetDataまではブレークポイントの設定が行なえるのですが、
4.の関数GetData実行途中でプログラムの実行が終了してしまいます。
原因も分からない状態ですが、GetDataの宣言または呼び出し方が悪いのではないかと思っています。

また、同じDLLに存在する他の関数(値渡し)に対しても同様にC#で呼び出しを行ないましたが、
すべて正常に呼び出しが行なわれ、期待する戻り値が得られています。   

どなたかアドバイスをください。
以上、よろしくお願いします。

引用返信 編集キー/
■35173 / inTopicNo.2)  Re[1]: C#からC/C++のDLL関数を呼び出したい
□投稿者/ .SHO (803回)-(2009/04/21(Tue) 15:16:07)
C#の配列はオブジェクトそのものであり
アドレス指定可能な単純な連続メモリ領域ではありません。
従って memcpy では、C# の配列が壊れます。
引用返信 編集キー/
■35177 / inTopicNo.3)  Re[2]: C#からC/C++のDLL関数を呼び出したい
□投稿者/ Hongliang (370回)-(2009/04/21(Tue) 15:38:18)
> C#の配列はオブジェクトそのものであり
> アドレス指定可能な単純な連続メモリ領域ではありません。
> 従って memcpy では、C# の配列が壊れます。
マーシャラによってアンマネージド関数の呼び出し中はピン止めされるので memcpy 自体は問題ありません。

配列は参照型なので、アンマネージドに渡す際ポインタに変換されます。ref/out による参照渡しも、ポインタに変換されます。
両者が組み合わさった結果、ref byte[] で渡されるのはポインタのポインタになってしまいます。C/C++ 側の宣言と一致してません。
引用返信 編集キー/
■35179 / inTopicNo.4)  Re[3]: C#からC/C++のDLL関数を呼び出したい
□投稿者/ .SHO (805回)-(2009/04/21(Tue) 16:00:21)
> マーシャラによってアンマネージド関数の呼び出し中はピン止めされるので memcpy 自体は問題ありません。
>
> 配列は参照型なので、アンマネージドに渡す際ポインタに変換されます。ref/out による参照渡しも、ポインタに変換されます。
> 両者が組み合わさった結果、ref byte[] で渡されるのはポインタのポインタになってしまいます。C/C++ 側の宣言と一致してません。

だそうです。失礼しました。。
引用返信 編集キー/
■35183 / inTopicNo.5)  Re[4]: C#からC/C++のDLL関数を呼び出したい
□投稿者/ うず (6回)-(2009/04/21(Tue) 16:48:59)
引数の参照渡しは全てref/outがいるものと言う考えにとらわれていました。
以下のようにして実現できました。

※DLLの関数宣言部分
[DllImport("DataCopy.dll")]
static extern int GetData (byte [] arg_Buf);

※実行部分
byte[] OutBuf= new byte[100];
GetData(OutBuf);


>ref byte[] で渡されるのはポインタのポインタ
覚えておきます。また、
>マーシャラによってアンマネージド関数の呼び出し中はピン止めされる
ということも知ることが出来ました。
どうもありがとうございました。
引用返信 編集キー/
■35184 / inTopicNo.6)  Re[5]: C#からC/C++のDLL関数を呼び出したい
□投稿者/ うず (7回)-(2009/04/21(Tue) 16:49:43)
解決済み忘れてしまいました
チェックつけます。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -