none
C#からCPPのDLLを呼ぶときの、構造体の引数の渡し方 RRS feed

  • 質問

  • CPP側--------------------------

    typedef struct {
        bool boA;       
        int iB;           
        char c1[256];
        char c2[256];
        double d1;       
    } STPart;

    typedef struct {
        STPart sPart[10];
    } STMain;

    void foo(STMain *sCPP)
    {
        sCPPにアドレス00000000(NULL)が渡ってきてしまう

        sCPP->sPart[0].c1[0] = 5;//当然エラー
    }

    C#側--------------------------------------
    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    private struct STPart {
        [MarshalAs(UnmanagedType.I1)]
        public bool boA;
        public int iB;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
        public byte[] c1;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
        public byte[] c2;
        public double d1;
    }

    [StructLayout(LayoutKind.Sequential, Pack = 4)]
    private struct STMain {
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
        public STPart[] stPart;
    }

    [DllImport("DLL.dll", EntryPoint = "foo", SetLastError = false)]
    private static extern int foo(ref STMain);

    void fooCall()
    {
     STMain stM = new STMain();
     int i;

     for(i=0;i<10;i++){
     stM.stPart[i] = new STPart();
     stM.stPart[i].boA = false;
     stM.stPart[i].iB = 10;
     stM.stPart[i].d1 = 9.9;
     foo(ref stM);
     }
    }

    以上のようなプログラムを作り、C#からCPP側の関数をコールするプログラムを作ったのですが、
    CPP側の構造体にアドレスが渡されずNULLになってしまいます
    そのため、渡した構造体の一部にデータを設定することが出来ずにいます
    構造体の宣言の仕方に間違いがあるのでしょうか

    2011年11月1日 8:52

回答

  • stM.stPart を初期化していないという問題を除けば、特に問題もなくほぼコピペで動きました。

    // 呼び出し規約は C++ のプロジェクトプロパティの方で設定しているのですよね?

    ref 渡しだとむしろ NULL を渡せなくて困るぐらいなので、このコードで sCPP 自体が NULL になることは考えがたいです。

    • 回答の候補に設定 山本春海 2011年11月10日 7:20
    • 回答としてマーク いちろう 2011年11月29日 16:12
    2011年11月1日 9:40

すべての返信

  • stM.stPart を初期化していないという問題を除けば、特に問題もなくほぼコピペで動きました。

    // 呼び出し規約は C++ のプロジェクトプロパティの方で設定しているのですよね?

    ref 渡しだとむしろ NULL を渡せなくて困るぐらいなので、このコードで sCPP 自体が NULL になることは考えがたいです。

    • 回答の候補に設定 山本春海 2011年11月10日 7:20
    • 回答としてマーク いちろう 2011年11月29日 16:12
    2011年11月1日 9:40
  • こんにちは、いちろう さん。
     
    MSDN フォーラムのご利用ありがとうございます。オペレーターの山本です。
    その後いかがでしょうか。

    Hongliang さんからの情報は確認されましたか?
    確認したことなど、追加情報を投稿されるとさらに情報を得られるかもしれません。
                                                           
    日本マイクロソフト株式会社 フォーラム オペレーター 山本 春海

    2011年11月21日 8:46
  • 遅くなってすいません。
    あれから色々いじっていたのですが、引数の数が違っていただけでした
    お騒がせしました

    2011年11月29日 16:12