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

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

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

Re[2]: C++で書かれたDLLをC#から呼び出すには


(過去ログ 143 を表示中)

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

■84181 / inTopicNo.1)  C++で書かれたDLLをC#から呼び出すには
  
□投稿者/ たろぴー (1回)-(2017/05/26(Fri) 09:36:39)

分類:[.NET 全般] 

お世話になります。

クライアントから渡されたDLLを自作のC#プログラムから呼び出したいのですが、
関数の仕様書がC++で書かれており、
知識不足から、C#からの呼び出し方がよくわからずに困っています。

ご指導よろしくお願いします。


//--仕様書(C++で書かれています)

//関数:
long Sample( FOO * foo );

//FOO構造体メンバ
Var_1 (型:unsigned char, サイズ16、In)
Var_2 (型:unsigned char, サイズ24、In)
Var_3(型:unsigned char, サイズ128、Out)



//--現在のコード--
//よくわからない点:
//構造体の宣言と初期化部分。C++でunsigned char * とあるものをC#でByte[N]としていいのかどうか・・
//FromHexString関数で16進数文字列をByteに変換している部分。C#の文字列をどう渡せばよいかわからないです。


   class CSample
    {
        //DLL「SampleFunc.dll」の宣言です。引数には構造体FOOを渡します。
        [DllImport("SampleFunc.dll", CallingConvention = CallingConvention.StdCall)]
        private extern static long SampleFunc(FOO foo);

        //構造体の定義
        public struct FOO
        {
            public byte[] Var_1;
            public byte[] Var_2;
            public byte[] Var_3;
        }

        public FOO foo;

        public CSample()
        {
            //構造体の初期化
            foo.Var_1 = FromHexString("0C08"); //4文字の16進数
            foo.Var_2 = FromHexString("12341234123412341234123412341234"); //32文字の4桁ごとの数字
            foo.Var_3 = new byte[128]; //DLLからの文字列を得るためのバッファ。
        }

        //文字列を16進数に変換する関数
        private static byte[] FromHexString(string str)
        {
            int length = str.Length / 2;
            byte[] bytes = new byte[length];
            int j = 0;
            for (int i = 0; i < length; i++)
            {
                bytes[i] = Convert.ToByte(str.Substring(j, 2), 16);
                j += 2;
            }
            return bytes;
        }

        //--実際にDLLを呼び出す関数
        private void ExecSample()
        {
            long ret = SampleFunc(foo); //ret にはエラーコードが入ってしまう。
        }
    }

引用返信 編集キー/
■84182 / inTopicNo.2)  Re[1]: C++で書かれたDLLをC#から呼び出すには
□投稿者/ Hongliang (547回)-(2017/05/26(Fri) 09:43:44)
FOO構造体を独自記法じゃなくてC++の記述そのまま書いていただきたいところですが。
いずれも固定長配列
unsigned char Var_1[16];
unsigned char Var_2[24];
unsigned char Var_3[128];
ということで合っていますか?
それともメンバ自体は単純に
unsigned char * Var_1;
unsigned char * Var_2;
unsigned char * Var_3;
で、要素数は規約として記述されているだけですか?
あるいはこれらのハイブリッドですか?

Var_3がunsigned char *であるなら、メモリの確保は呼び出し側と呼び出され側どっちが担当するのでしょうか?

というのが分かっていないと正しく回答できません。
まずこれらをはっきりさせて下さい。
引用返信 編集キー/
■84185 / inTopicNo.3)  Re[2]: C++で書かれたDLLをC#から呼び出すには
□投稿者/ 774RR (527回)-(2017/05/26(Fri) 11:32:58)
参考リンク
https://ja.stackoverflow.com/questions/35020/

SO で sayuri さんは Hongliang 氏の提示した前者かつ Ansi string と決め付けている様子ですが
オイラも Hongliang 氏に同意。正しいソースがないと無駄な努力に終わるっす。
最初から「正しい」コードを提示してくんないと詳しいこと書き込む気になれないです。

FromHexString は「あなたがそう解釈して作った」関数であるものと推定されますけど
その実装は C++ 側が期待しているものと同じであると断言できますか?
むしろ C++ でその関数を使っている箇所を示してもらうほうがよっぽど役に立つっす。
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -