none
引数を文字列型のC++で作成したDLLの関数をC#から使用したい RRS feed

  • 質問

  • 今、CPPで作成したDLLをC#から使用出来るようにインターフェース用のDLLを作成しています
    ただ、困ったことに引数が文字列型の場合(CPP側だとキャラクター配列)うまいこと値を引き津下ません

    ---------------------------------------------------------------
    C++のDLL
    extern "C" void fooCPP(char *mojiretsu){
        //mojiretsuは末尾0
        strcpy(mojiretsu, "mojimoji");
        ...
    }
    ---------------------------------------------------------------
    C#のインターフェース用DLL
    namespace interf{
     class CS{
      [DllImport("kernel32.dll")]
      public static extern void fooCPP(ref string mojiretsu);
     }
    }
    ---------------------------------------------------------------
    関数を呼び出すとき、
    void yobimoto(){
    string s;
    s="              ";    //文字列分確保しているつもり

    interf.CS.fooCPP(ref s);    //ここでエラー
    label1.test = s;
    }
    ---------------------------------------------------------------

    として、呼ぶときにchar*からstring型に変換出来ません
    間のDLLに何か変換するための仕組みが必要だと思うのですが
    char*からstringにどのように変換したらいいのでしょう
    2010年3月8日 14:36

回答

  • 文字列を表すバッファを渡して、関数の中で書き換えが生じるケースでは、StringBuilder を使うことが多いと思います。
    GetPrivateProfileString を C# で使うサンプルを探してみると、疑問を解消できるかもしれません。
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク いちろう 2010年3月9日 14:39
    2010年3月8日 14:51
    モデレータ

すべての返信

  • 文字列を表すバッファを渡して、関数の中で書き換えが生じるケースでは、StringBuilder を使うことが多いと思います。
    GetPrivateProfileString を C# で使うサンプルを探してみると、疑問を解消できるかもしれません。
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    • 回答としてマーク いちろう 2010年3月9日 14:39
    2010年3月8日 14:51
    モデレータ
  • ありがとうございます。無事受け取ることが出来ました
    今度は関数ごとに戻ってくる文字コードが違っていて(何でだ・・・)難儀する羽目になりましたが、
    StringBuilderを知らずにいたら大変な目に遭うところでした
    2010年3月9日 14:39
  • 今度は関数ごとに戻ってくる文字コードが違っていて(何でだ・・・)難儀する羽目になりましたが、
    StringBuilderを知らずにいたら大変な目に遭うところでした
    念のため:DllImport 属性の CharSet とかも確認してみてください。
    質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
    2010年3月9日 14:57
    モデレータ