none
C#アプリとVC++DLLのやりとりの質問が2点あります RRS feed

  • 質問

  • C#アプリとVC++DLLのやりとりの質問が2点あります

    -------------------------------------------------------
    1.
    C#からVC++で作成されたDLLの関数を呼び出す際に
    C++側で
    void hoge(int a,void **b);
    と宣言された関数の場合、

    [DllImport("dll.dll")]
    void hoge(int a,ref IntPtr b);

    として戻ってきたbからデータをどのように取り出せばいいのでしょうか
    byteの配列に取り出すにしてもVC++のポインタの扱いがよくわからなくて・・・

    -------------------------------------------------------
    2.
    似たような質問なのですが
    C++側で
    typedef unsigned short peko[100];
    typedef struct st{
        int a;
        int b;
        peko *p;
    }st;
    void hoge(st *stp);


    C#側で
    [StructLayout(LayoutKind.Sequential)]
    struct ST
    {
        int a;
        int b;
        IntPtr c;
    };

    [DllImport("dll.dll")]
    void hoge(ref ST stdata);

    として戻ってきたstdata.cはIntPtrから配列に変換するにはどのようにしたらいいでしょう
    cのアドレスにあるデータを
    単純に
    short[] shorthai = new short[100];
    の配列にコピーする方法だけでも知りたいです




    2011年3月2日 11:18

回答

  • 1.については情報が足りません。引数bがpointer of pointerですが、この手のパターンの場合、メモリ確保が絡んでいて、呼び出し側が確保する or 関数側が確保するなどなどあると思います。呼び出し側となるC#はref IntPtrでいいのかどうか、というところからありそうです。

    2.については単純な配列なのでMarshal.Copy()かな。構造体へのポインターならMarshal.PtrToStructure()です。

    • 回答としてマーク 山本春海 2011年3月15日 7:10
    2011年3月2日 12:27

すべての返信

  • 1.については情報が足りません。引数bがpointer of pointerですが、この手のパターンの場合、メモリ確保が絡んでいて、呼び出し側が確保する or 関数側が確保するなどなどあると思います。呼び出し側となるC#はref IntPtrでいいのかどうか、というところからありそうです。

    2.については単純な配列なのでMarshal.Copy()かな。構造体へのポインターならMarshal.PtrToStructure()です。

    • 回答としてマーク 山本春海 2011年3月15日 7:10
    2011年3月2日 12:27
  • ありがとうございます。

    Marshal.Copy()とMarshal.PrtToStructure() でなんとか、2点目は解決できました

    1.のほうは、メモリをどう扱うのか調査中です

    詳細がわかったら再度別に質問したいと思います(もしかしたらMarshal.PrtToStructureあたりで何とかなればと甘いことを考えてますが)

    2011年3月3日 11:36