none
OLEデータのサイズ(ファイルに書き込まれるサイズ)がしりたい RRS feed

  • 質問

  • お世話になります。

    VS2010+MFCでアプリケーションを作成しているのですが、
    貼り付けられたOLEデータを保存する際(された)サイズが知りたいのですが、
    可能でしょうか。

    COleClientItem::Serialize(ar);で保存しているのですが、
    実行前のファイルポインタと実行後のファイルポインタからサイズを算出できればいいのですが、
    ほかに方法があれば教えてください。

    2013年11月11日 9:36

回答

  • 一番簡単なのは、保存させる ar の作成を、HGLOBAL 上に行い(いろいろ段取りがあるので単純ではない)、それでサイズをチェックするですかね。

    MFCの実装で、保存先のファイルが、フラットファイル(Structured Storageではないファイル)の場合に、HGLOBAL にストレージを用意して、そこに保存してから、それを丸ごと保存するという段取りがあります。

    その部分を参考にすれば、必要になるファイルサイズの概算を計算することができると思います。ところで、なぜ計算が必要なのでしょう?

    もしかしたら、計算しても意味がないかもしれませんよ?

    一応OLEデータの保存のことについては、Compound Documents に載っています。ま、ファイルフォーマットとは違って実装も含めて乗ってるので余計なものがいっぱいに感じると思いますけど(MFCだと見えない部分でいろいろやってくれてるので余計に...)


    とっちゃん@わんくま同盟, Microsoft MVP for Visual C++ (Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答としてマーク TAKAKUN 2013年11月12日 1:33
    2013年11月11日 9:59

すべての返信

  • 一番簡単なのは、保存させる ar の作成を、HGLOBAL 上に行い(いろいろ段取りがあるので単純ではない)、それでサイズをチェックするですかね。

    MFCの実装で、保存先のファイルが、フラットファイル(Structured Storageではないファイル)の場合に、HGLOBAL にストレージを用意して、そこに保存してから、それを丸ごと保存するという段取りがあります。

    その部分を参考にすれば、必要になるファイルサイズの概算を計算することができると思います。ところで、なぜ計算が必要なのでしょう?

    もしかしたら、計算しても意味がないかもしれませんよ?

    一応OLEデータの保存のことについては、Compound Documents に載っています。ま、ファイルフォーマットとは違って実装も含めて乗ってるので余計なものがいっぱいに感じると思いますけど(MFCだと見えない部分でいろいろやってくれてるので余計に...)


    とっちゃん@わんくま同盟, Microsoft MVP for Visual C++ (Oct 2005-) http://blogs.wankuma.com/tocchann/

    • 回答としてマーク TAKAKUN 2013年11月12日 1:33
    2013年11月11日 9:59
  • やりたいことは、OLEデータがシリアライズしている部分を読み飛ばしたい、シリアライズさせたくないので、
    COleClientItem::Serialize(ar);
    が実行する前に、上記のシリアライズサイズを書き込めれば、読み込み時にスキップできるのではと
    考えています。

    理想が、
    ar << (DWORD)
    COleClientItem::GetSize();
    COleClientItem::Serialize(ar);

    ですが、HGLOBAL に保存をさせてからサイズを取得するメソッドを派生クラスに実装できるか
    やってみようと思います。

    2013年11月12日 0:24
  • MFCの実装で、COleClientItem::Serialize(ar);をデバックでおっかけていってみると、OLEデータサイズをシリアライズしてから、
    OLEデータを書き込んでいることがわかりました。

    特に何もせずに解決できそうです。

    ありがとうございました。

    2013年11月12日 1:33
  • OLEデータがシリアライズしている部分というのは、OleSave している個所ということですよね?

    とすると、WriteItem() や、ReadItem() に細工することで飛ばすことができるかな?と思います。

    解析の基本は、コードがある部分でまず何をやっているかをきちんと把握するところからです。

    まずは、COleClientItem::Serialize や、COleDocument::OnOpenDocument/OnSaveDocument/Serialize が何をやっているかをきちんと把握するところから始めてみてはいかがでしょう?

    そのうえで、必要なこと、クリアすべき問題点を洗い出してみるのが一番の近道だと思います。

    みな、あえて言及を避けていますが、特殊なフォーマットの解析というのはそんなに単純なものではありませんよ(リファレンスがあっても、一日二日でどうにかなるようなものじゃないと思います)。


    とっちゃん@わんくま同盟, Microsoft MVP for Visual C++ (Oct 2005-) http://blogs.wankuma.com/tocchann/

    2013年11月12日 2:01
  • >みな、あえて言及を避けていますが、特殊なフォーマットの解析というのはそんなに単純なものではありませんよ(リファレンスがあって
    >も、一日二日でどうにかなるようなものじゃないと思います)。

    心したいと思います。



    2013年11月12日 2:26