none
リンク貼り付けたドキュメントの判別 RRS feed

  • 質問

  • お世話になります。

    MFCアプリケーションを作成しています。

    現在開いているドキュメントが、EXCELなどのコンテナに埋め込まれたオブジェクトを
    開いているのかを判別するために、
    IsEmbedded()を使用しています。

    リンク貼り付けされたドキュメントの場合、IsEmbedded()では判別ができません。

    判別方法ありますでしょうか。

    2013年4月17日 0:42

回答

  • ドキュメントが抱えている COleServerItem(CDocItemの派生クラス)の IsLinkedItem() で判断できるはずです。

    COleServerItem は、COleDocument::GetStartPosition() と、 COleDocument::GetNextServerItem() の2つのメソッドで取り出せます。

    リンクはいろいろあってやってないのでこれ以上はちょっとわからんです。


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

    • 回答としてマーク Brillia 2013年4月17日 5:14
    2013年4月17日 2:32

すべての返信

  • ドキュメントが抱えている COleServerItem(CDocItemの派生クラス)の IsLinkedItem() で判断できるはずです。

    COleServerItem は、COleDocument::GetStartPosition() と、 COleDocument::GetNextServerItem() の2つのメソッドで取り出せます。

    リンクはいろいろあってやってないのでこれ以上はちょっとわからんです。


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

    • 回答としてマーク Brillia 2013年4月17日 5:14
    2013年4月17日 2:32
  • ご返事ありがとうございました。

    確かに、リンク貼り付けたデータからの起動と

    アプリケーションの通常起動(新規作成と同じ)では、GetStartPosion()はNULLで、
    EXCELにリンク貼り付けたデータからの起動では、
    GetStartPosion()はPOSITIONクラスのインスタンスがかえってきました。

    ただ、IsLinkedItem()がTRUEとならなかったのが、ふしぎなのですが、
    上記の判別(GetStartPositon())でも対応できそうなので、もう少し調べてみます。

    ただ、サーバーアイテムのリストとして追加されているのか不思議でした。

    2013年4月17日 5:14
  • だめですか?。。。と思ってちょっとソースを見てみました。

    IsLinkedItem() の実装は、return GetDocument()->m_pEmbeddedItem != this;

    となっていますね。

    これだけじゃ判断できないので、当然次に来るのが、m_pEmbeddedItem が指し示す値は何か?です(m_pEmbeddedItem は、COleServerDoc のプロテクトメンバーです)。

    MFCのソースを検索したところ、こいつに値を代入してるのは COleServerItem* COleServerDoc::GetEmbeddedItem()

    で、その中で

    m_pEmbeddedItem = OnGetEmbeddedItem();

    としています。

    次は、OnGetEmbeddedItem() の実装。。。と思ったら、これ、ユーザーアプリが設定する値です。

    これ以上はたどれない(OnGetEmbeddedItemの実装はアプリケーション固有のため)のでとりあえずここまで。。。

    OnGetEmbeddedItem でリンクかどうかが判定できる状態になっているなら、それで判断可能です。

    そうではない場合は。。。判断できないですねー。IOleLink とかMFCでは実装されてないんで、IMoniker から再構築する場合は、どうすればいいか?とかもう覚えてない。。。

    昔は、OLE系のサンプルにツリーでリンクを保持できるやつがあったんですが。。。あれって今もあるのかな?
    #たしか、MFCの実装でリンクをやる場合はあれと同じような実装形態をとっていないと賄えなかったはずなので


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

    2013年4月17日 6:23
  • ご返事ありがとうございます。

    自分の整理のため、現象をもう一度記載します。

    EXCELに、通常に貼り付けたオブジェクトを、アウトプレースにて起動した場合は、IsEmbedded()はTRUEです。

    「オブジェクトの挿入」-「ファイルから」(リンクにチェック)で、貼り付けたものから
    アウトプレースにての起動時は、IsEmbedded()はFALSEです。

    次に、NULL == pDoc->GetStartPosition()では

    新規ドキュメント:TRUE
    通常貼り付けたオブジェクトからのアウトプレース:FALSE
    リンク貼り付けたオブジェクトからのアウトプレース:FALSE
    ※この判断では、自分ドキュメントにEXCELが貼り付けられたら、FALSE

    COleServerItem のインスタンスが、自身のファイルタイプと判別できる方法があればいいのですが。。。

    2013年4月18日 0:09
  • ふむ。。。あとは、何か手がかりになりそうなものというと、COleServerItem::GetItemName() くらいですかね。

    一応、リンク向けにはあらかじめ名前を設定してあるはずです。

    ほかは、COleLinkingDocのプロテクトメンバーである

     CString m_strMoniker;   // filename used to create moniker

    の内容をチェックしてみるとか。。。

    それくらいしか思いつかないですね。


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

    2013年4月18日 1:12
  • ご返事ありがとうございます。

    GetItemName()は調べていましたが、空でした。

    引き続き調査して、わかりましたら、報告するようにします。

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

    2013年4月18日 3:49