none
Outlook 2013用アドインの開発について(リボン項目の追加方法) RRS feed

  • 質問

  • こんにちは。お世話になります。

    現在、業務でVC++を利用したOutlook用アドインの開発を行っているのですが、Outlook 2010までなら正常に動くコードが、Outlook 2013では動かなくなってしまった(起動時にクラッシュしてしまう)ので対策を検討しています。

    これをデバッガで追ったところ、リボンへのアドインタブ追加の際にエラーが発生しており、リボンへの項目追加処理をコメントアウトすることで問題なく動作することは確認できました。

    ここで質問なのですが、Outlook 2013(に限らずOffice 2013全体かもしれませんが)では、リボンへの項目追加の仕様が変わってしまったのでしょうか。また、対応策があればご教示いただけないでしょうか。

    よろしくお願いします。

    2013年11月29日 9:14

回答

  • みなさん返信ありがとうございました。

    いろいろなつてを当たって調査したところ、Office 2007以前とOffice 2010以降ではメニューへの項目追加の仕様が全く異なっており、さらに、Office 2010までは互換性があったもののOffice 2013からは互換性が排除されたことがわかりました。

    そして、実装についての情報は以下のURLに存在しました。

    Outlook 2010 の C++ アドインをビルドする http://msdn.microsoft.com/ja-jp/library/ee941475.aspx

    ご協力いただきありがとうございました。

    • 回答としてマーク 星 睦美 2013年12月16日 5:44
    2013年12月16日 3:27

すべての返信

  • レス付きませんね。解答ではありません、あしからず。
    まだ解決していないようであれば、もう少し具体的なクラス名称、
    関数名称、あれば、報告されるエラー内容、及びログを掲載してみてはどうでしょう。
    ただし、CMFC***に詳しい人はそう多くはないと考えられます。
    2013年12月3日 4:41
  • 反応いただきありがとうございます。

    具体的にはGoogle codeにある下記のコードとほぼ同等のコードなのですが、Outlook 2010までは期待通りの動作をするもののOutlook 2013では次のエラーが表示されました。

    問題の署名:
     問題イベント名:	APPCRASH
      アプリケーション名:	OUTLOOK.EXE
      アプリケーションのバージョン:	15.0.4551.1004
      アプリケーションのタイムスタンプ:	5253ad6f
      障害モジュールの名前:	KERNELBASE.dll
      障害モジュールのバージョン:	6.1.7601.18229
      障害モジュールのタイムスタンプ:	51fb1116
      例外コード:	e06d7363
      例外オフセット:	0000c41f
      OS バージョン:	6.1.7601.2.1.0.256.48
      ロケール ID:	1041
    

    対象コードは以下になります。

    引用元:http://code.google.com/p/outcall/source/browse/trunk/OutlookAddin/MyAddin.cpp (366-384)

        // Add menu item
    
        _bstr_t bstrNewMenuText(CString(APP_NAME).AllocSysString());
        CComPtr < Office::CommandBarControls> spCmdCtrls;
        CComPtr < Office::CommandBarControls> spCmdBarCtrls;
        CComPtr < Office::CommandBarPopup> spCmdPopup;
        CComPtr < Office::CommandBarControl> spCmdCtrl;
        CComPtr < Office::CommandBar> spCmdBar;
    
        // get CommandBar that is Outlook's main menu
        HRESULT hr = spCmdBars->get_ActiveMenuBar(&spCmdBar);
        if (FAILED(hr))
                return S_FALSE; //hr;
        // get menu as CommandBarControls
        spCmdCtrls = spCmdBar->GetControls();
        ATLASSERT(spCmdCtrls);
    
        // we want to add a menu entry to Outlook's 6th(Tools) menu     //item
        CComVariant vItem(5);
        spCmdCtrl= spCmdCtrls->GetItem(vItem);
        ATLASSERT(spCmdCtrl);
    

    先に挙げたエラーは、上のコードの最下部、メニューに項目を追加する箇所の下線の行で発生していましたので、このあたりの仕様がOutlook 2010以前と2013以降で異なっているのではないかと考えています。

    C++によるOutlook COMアドインの開発経験のある方がいらっしゃいましたら、知恵をお借りしたいです。

    よろしくお願いします。

    2013年12月5日 4:11
  • ささいな質問で申し訳ありませんが、
    (Tools)menu がインデックスの5番でない可能性について検証してみましたか。
    つまり、「何番で」何が取れるのかってことですけど。
    2013年12月5日 5:36
  • インデックスについては、0,2,4,6と変えて確認しましたが、結局同じエラーが発生しました。

    ですので、そもそも spCmdCtrls に正しいメニューバーが取れていない、つまり、ひいてはメニューバーへのアクセス方法自体違うのではないかと個人的には予想しています。考えにくいことかもしれませんが……

    なお、当初の書き込みに書き忘れてしまいましたが、VS2010のC++で開発しております。VS2012など新しいバージョンでないとダメ、などという可能性はあるでしょうか。

    情報が五月雨式で申し訳ないです。

    2013年12月5日 6:36
  • (関係無いと思われるようでしたらスルーしてください。)

    >  障害モジュールの名前: KERNELBASE.dll
    >  障害モジュールのバージョン: 6.1.7601.18229
    >  障害モジュールのタイムスタンプ: 51fb1116
    >  例外コード: e06d7363
    >  例外オフセット: 0000c41f

    ご使用になられている Windows プラットフォームの詳細が記載されていなかったので断言はできませんが。。。
    私の手元の Windows7 32ビット プラットフォーム kernelbase.dll が、記載されているモジュール バージョンと同じでしたので、このモジュールの中身を調べてみました。
    上記情報が正しければ、問題発生個所は、kernelbase.dll 内に実装されている LocalReAlloc() ルーチンの中。。。ということになると思います。
    (オフセット値は、モジュール バージョ毎に微妙に異なります。)
    自分でデバッグした訳ではないので何とも言えませんが、ご指摘されている部分が、その処理の延長上で kernelbase!LocalReAlloc ルーチンを呼び出すことがあるのか、ちょっと疑問に感じました。
    実際に問題が発生しているアドインは、今回ご提示されている "OutlookAddin" と「ほぼ」同等とのことですが、もしご指摘の箇所が本当に問題であるならば、"OutlookAddin" でも同じ現象が発生すると思うのです。
    ですので、問題を切り分けるためにも、"OutlookAddin" をビルド/インストールして、同一現象が起きるか、ご確認されてみてはいかがでしょうか?

    2013年12月5日 7:46
  • 反応ありがとうございます。

    先の書き込みに例として挙げたアプリケーションですが、インストーラーが存在したのでインストールしてみたところ、OutlookアドインのコードはあるもののアドインとしてOutlook 2013/2010に登録されないという結果になりました。

    参考にできるかと思いましたが残念です。ともあれ、有用なご意見ありがとうございました。

    2013年12月5日 8:32
  • ご質問内容を読み返してみたら。。。既にご自身でデバッガを使って追ってみていたんですね。
    「起動時にクラッシュ」した時に、デバッガに落ちた (break in した) と思いますが、その時のコールスタックはどのようになっていたのでしょうか?
    MS が公開しているシンボル サーバを利用すれば、クラッシュした時に呼び出されていた kernelbase.dll 内の関数が特定できるので、調査の手掛かりになると思います。
    以下は VS2008 におけるシンボル サーバの設定方法ですが、VS2010 も似たような手順で設定できると思います。

    ---------------------------------------------
    方法 : シンボル サーバーを使用する
    http://msdn.microsoft.com/ja-jp/library/b8ttk8zy(v=vs.90).aspx
    ---------------------------------------------

    2013年12月5日 11:56
  • みなさん返信ありがとうございました。

    いろいろなつてを当たって調査したところ、Office 2007以前とOffice 2010以降ではメニューへの項目追加の仕様が全く異なっており、さらに、Office 2010までは互換性があったもののOffice 2013からは互換性が排除されたことがわかりました。

    そして、実装についての情報は以下のURLに存在しました。

    Outlook 2010 の C++ アドインをビルドする http://msdn.microsoft.com/ja-jp/library/ee941475.aspx

    ご協力いただきありがとうございました。

    • 回答としてマーク 星 睦美 2013年12月16日 5:44
    2013年12月16日 3:27