none
CComPtr<IStream> と System::IO::FileStream RRS feed

  • 質問

  • MFCで定義した CComPtr<IStream> を、.netの System::IO::FileStream に結びつける方法はあるのでしょうか?
    ご存知の方、いらっしゃいませんか?

    現在、MFCアプリケーションでIStorage, IStreamを利用しファイルを保存しています。そのファイルに、.netで作成したコントロールの情報を追記保存したいのですが、BinaryFormatterのSerializeを利用しているため、System::IO::FileStream を使用しています。MFC側のIStreamにFileStreamが結びつけることができれば、1つのファイルとして保存できると考えているのですが、.net初心者のため、なかなか方法が思いつきません。できるかどうかも判断しかねているところです。
    2010年3月4日 2:41

回答

  • .NET でも IStream インターフェースが利用できますが(System.Runtime.InteropServices.ComTypes 名前空間のもの)ちょっと見た限りは、System.IO.Stream(BinaryFormatter.Serialize は Streamクラスを受け取る) の派生クラスとしては用意されていないようです。

    Streamクラスの派生クラスはないみたいなので、代替手段としては、一度メモリー系のストリーム(MemoryStream または UnmanagedMemoryStream)に書き出して、そのメモリイメージを最終的な IStream に保存するという形をとるという手段が一番実装コストが少ないと思います。
    もちろん、動作コストを下げるためにIStreamへのアクセス用Streamクラスを作るというのもアリです。

    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    • 回答としてマーク かばさん 2010年3月10日 2:07
    2010年3月4日 4:24
  • メモリデータを取り出す方法は周りの影響を受けるのでどれがいいかは一概には何とも。。。

    むしろ、BinaryFormatterに渡す Stream をどういう風につくるのか?のほうがポイントとしては大きいといえます。

    C++/CLI のコードエリア上で、BinaryFormatter を呼び出すあるいは、
    C++/CLI で Stream オブジェクトを作って、DLLなどに渡して書き込んでもらうというのであれば、
    UnmanagedMemoryStream を用意してそこに書き込んでもらうのが一番効率が良いと思います。
    これなら、書き込まれたストリームがもつメモリに直接的にポインタアクセスすることができるため、
    わずらわしい変換処理が全く介在しなくなります。

    この辺りは、全体がどういう形なのか?がわからないとどれを選択するのがいいか?は選べない部分となります。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    • 回答としてマーク かばさん 2010年3月10日 2:07
    2010年3月4日 8:36

すべての返信

  • .NET でも IStream インターフェースが利用できますが(System.Runtime.InteropServices.ComTypes 名前空間のもの)ちょっと見た限りは、System.IO.Stream(BinaryFormatter.Serialize は Streamクラスを受け取る) の派生クラスとしては用意されていないようです。

    Streamクラスの派生クラスはないみたいなので、代替手段としては、一度メモリー系のストリーム(MemoryStream または UnmanagedMemoryStream)に書き出して、そのメモリイメージを最終的な IStream に保存するという形をとるという手段が一番実装コストが少ないと思います。
    もちろん、動作コストを下げるためにIStreamへのアクセス用Streamクラスを作るというのもアリです。

    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    • 回答としてマーク かばさん 2010年3月10日 2:07
    2010年3月4日 4:24
  • > Streamクラスの派生クラスはないみたいなので、代替手段としては、一度メモリー系の
    > ストリーム(MemoryStream または UnmanagedMemoryStream)に書き出して、そ
    > のメモリイメージを最終的な IStream に保存するという形をとるという手段が一番実装
    > コストが少ないと思います。

    ありがとうございます。

    なるほど、この考えは浮かびませんでした。Streamとしてではなく、単なるメモリブロックとして扱うということですね。メモリイメージを取得するには、GetBuffer(), ToArray(), Read()が使えそうな気がしました。ヘルプを見た感じ、その中でもToArray()がいいのではと思ったのですが、何か問題等があれば教えていただけますか?
    2010年3月4日 6:18
  • メモリデータを取り出す方法は周りの影響を受けるのでどれがいいかは一概には何とも。。。

    むしろ、BinaryFormatterに渡す Stream をどういう風につくるのか?のほうがポイントとしては大きいといえます。

    C++/CLI のコードエリア上で、BinaryFormatter を呼び出すあるいは、
    C++/CLI で Stream オブジェクトを作って、DLLなどに渡して書き込んでもらうというのであれば、
    UnmanagedMemoryStream を用意してそこに書き込んでもらうのが一番効率が良いと思います。
    これなら、書き込まれたストリームがもつメモリに直接的にポインタアクセスすることができるため、
    わずらわしい変換処理が全く介在しなくなります。

    この辺りは、全体がどういう形なのか?がわからないとどれを選択するのがいいか?は選べない部分となります。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    • 回答としてマーク かばさん 2010年3月10日 2:07
    2010年3月4日 8:36
  • ありがとうございました。
    思っていた機能に、一歩近づきました。

    2010年3月10日 2:08