none
ATL:CString型等で保存した文字列をマネージコードモジュールから直接読取る方法について RRS feed

  • 質問

  • 自分で探した範囲では見つからなかったのでお尋ねいたします。C++を利用してATLおよびMFCのCString型やBSTR型で保存された文字列データをC#で開発したマネージコードでファイルから読み込みたいと考えています(サーバーモジュールとして実行したい)。単純に読み込もうとしても失敗するため、文字列の変換が必要に思われますが、準備されている方法がございましたら、教えてください。
    2006年2月1日 2:23

すべての返信

  • バイナリで保存しているデータでしょうか。

    であればちょっと厳しいかもしれません。

    C++/CLIで読み取りルーチンを作れば簡単に実装可能ですね(^^

    2006年2月1日 2:43
  • 中さん、コメントありがとうございます。

    ※元の質問が複数のスレッドとして投稿されていたため、マージした上で重複部分を削除しました。ご了承ください。

    この投稿は現状のまま何の保証もなく掲載しているものであり、何らかの権利を許諾するものでもありません。コミュニティにおけるマイクロソフト社員による発言やコメントは、マイクロソフトの正式な見解またはコメントではありません。詳しくは http://www.microsoft.com/japan/communities/msp.mspx をご覧ください。

    2006年2月1日 10:25
  • レスが遅くなりました。ご指導ありがとうございました。

    説明が不足しており、誠に申し訳ございませんでした。

    正確には、

      ATL::CComBSTR.WriteToStream() 関数

    を利用しています。CString::AllocSysString() 関数によってCComBSTR型に変換し、IStreamに対して出力しています。

     

    ちなみにC++/CLIで行う場合は、

      1)/clr オプション付でコンパイルする

      2)混在アセンブリでデータ変換ツールを作成する

    として、一度データ変換を行ってからサーバーアップをしたほうが良いでしょうか?

     

    よろしくご指導のほどお願い申し上げます。

    2006年2月8日 3:04
  • WriteToStream() での吐き出しが,
    ファイルの先頭から,単純に収まっているのならば,

     文字列のバイト長を表す4バイト & 文字列 & 終端文字

    という繰り返しになっていると思うので,
    バイナリモードでファイルを開いて,
    まず,4バイト をバイト配列に読み込み,int型に変換,
    それが,文字列のバイト数を表しているので,
    それに OLECHARの終端文字のバイト数,つまり,2 を加算。
    そのバイト数だけ,ファイルからバイト配列に読み込んで,
    それをstring型にすれば,C# で文字列として扱えるでしょう。

    あとは,その繰り返しです。

    2006年2月8日 9:15
  • ご指導ありがとうございました。

    その後、トライした結果を報告します。

                UnicodeEncoding unicode = new UnicodeEncoding();

                Int32 nLen = (Int32)rdr.ReadInt32();
                Byte[] buf = new Byte[nLen];

                if (nLen > 2)
                {
                    buf = rdr.ReadBytes(nLen-2);
                    string strName = unicode.GetString(buf);
                }
                if ( nLen - 2 >= 0 ) rdr.ReadBytes(2);

    でうまくいきました。なお、NULL文字列の場合、文字列長のデータ域に2もしくは0が入っているため、上記のような処理となっています。ATLのバージョンによってそのような処理が必要になるのでしょうか?

     

    2006年2月14日 10:36