Office関連

メモ帳だけでOutlook用アドインを作ってみる。

SharpDevelopでExcel用COMアドインを作成する方法」で、SharpDevelopを使ってExcel用のCOMアドインを作成する方法を紹介していますが、「VBAから扱えるDLLをC#で書いてみる。」で書いたように、ソースコードをコンパイルして手動でレジストリに登録すれば良いので、SharpDevelopやVisual StudioといったIDEが無くても、Office用のCOMアドインを作ることができます。

そこで今回は、メモ帳だけを使って(コンパイラやRegAsmは別)Outlook用のCOMアドインを作ってみることにします(Windows 7 x86 + Office 2010 x86環境)。

ソースコードのビルド

まずはC#で適当にコードを書きます。
Guidは「Generate GUIDs online」等のサービスやツールを使って生成したものと置き換えてください。

また、「selectedItem」をdynamicにしていますので、C# 4.0より前の環境でコンパイルする場合には、型を適当にキャストしてください。

・MyOutlookAddIn.cs

namespace MyOutlookAddIn{
    using System;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    using Extensibility;
    using Outlook = Microsoft.Office.Interop.Outlook;
    
    //Guidは要変更
    [ComVisible(true), Guid("367add9b-32f8-403b-b3d2-59f7179f887e"), ProgId("MyOutlook.AddIn")]
    public class Connect : Object, Extensibility.IDTExtensibility2, IRibbonExtensibility{
        private Outlook.Application olApp;
        private Outlook.Explorer olExplorer;
        
        public Connect(){}
        
        public void OnConnection(object application, ext_ConnectMode ConnectMode, object AddInInst, ref System.Array custom){
            olApp = ((Outlook.Application) application);
        }
        
        public void OnDisconnection(ext_DisconnectMode RemoveMode, ref System.Array custom){
            if(olExplorer != null){
              Marshal.ReleaseComObject(olExplorer);
              olExplorer = null;
            }
            if(olApp != null){
              Marshal.ReleaseComObject(olApp);
              olApp = null;
            }
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
        public void OnAddInsUpdate(ref System.Array custom){}
        public void OnStartupComplete(ref System.Array custom){}
        public void OnBeginShutdown(ref System.Array custom){}
        
        public string GetCustomUI(string RibbonID){
            return @"<?xml version=""1.0"" encoding=""utf-8""?>
<customUI xmlns=""http://schemas.microsoft.com/office/2009/07/customui"">
  <contextMenus>
    <contextMenu idMso=""ContextMenuMailItem"">
      <button id=""btnSample"" label=""Sample Button"" imageMso=""HappyFace"" onAction=""btnSample_onAction"" />
    </contextMenu>
  </contextMenus>
</customUI>";
        }
        
        public void btnSample_onAction(IRibbonControl control){
            try{
                olExplorer = (Outlook.Explorer)olApp.ActiveExplorer();
                dynamic selectedItem = olExplorer.Selection[1];
                MessageBox.Show(selectedItem.Subject);
            } catch (Exception) {
                MessageBox.Show("エラーが発生しました。", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
    
    [ComImport, ComVisible(true), Guid("000C0396-0000-0000-C000-000000000046"), TypeLibType((short)0x1040)]
    public interface IRibbonExtensibility{
        string GetCustomUI(string RibbonID);
    }
    
    [ComImport, ComVisible(true), Guid("000C0395-0000-0000-C000-000000000046"), TypeLibType((short)0x1040)]
    public interface IRibbonControl{
        [DispId(1)]
        string Id{get;}
        [DispId(2)]
        object Context{get;}
        [DispId(3)]
        string Tag{get;}
    }
}

Build_Outlook_ComAddIn_Notepad_01

ソースコードの準備ができたら「VBAから扱えるDLLをC#で書いてみる。」の“ソースコードのコンパイル”を参考に、csc.exeでコンパイルを行います。

ただし、上記コマンドを実行しても、下図のようにコンパイルエラーが発生してしまいます。

Build_Outlook_ComAddIn_Notepad_02

これは、エラー内容通り指定した名前空間を含むアセンブリへの参照を追加していないためで、解決するには「/reference」オプションで参照を追加する必要があります。

そして、肝心の「Extensibility」と「Microsoft.Office.Interop.Outlook」がどこにあるかというと、「C:\Windows\assembly」以下で見つけることができます。

Build_Outlook_ComAddIn_Notepad_09

・・・が、上図の通りエクスプローラーでフォルダを開いてもdllファイルの場所が分かりません。

そこで、コマンド プロンプトから C:\Windows\assembly フォルダ内を検索することで、dllファイルのパスを調べることができます。

Build_Outlook_ComAddIn_Notepad_03

Build_Outlook_ComAddIn_Notepad_04

dllファイルのパスが分かれば、あとは /reference で指定するだけです。

Build_Outlook_ComAddIn_Notepad_05

大分長くなってしまいましたが、これでコンパイルエラーが出なくなりました。

レジストリへの登録

無事にコンパイルできたら、次はレジストリへの登録です。
VBAから扱えるDLLをC#で書いてみる。」の“RegAsm.exe(アセンブリ登録ツール)によるDLLの登録”を参考に、RegAsm.exeでレジストリへの登録を行います。

Build_Outlook_ComAddIn_Notepad_06

アドインとして登録

最後はアドインとして利用できるよう、レジストリの編集を行います。
作業手順は「SharpDevelopでExcel用COMアドインを作成する方法」の“アドインとして登録(レジストリ編集)”を参考にしてください。

キー:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\Outlook\Addins\MyOutlook.AddIn
Description(REG_SZ):メモ帳で作ったOutlook用アドインです。
FriendlyName(REG_SZ):My Outlook AddIn
LoadBehavior(REG_DWORD):3 (スタート時に読み込む)

Build_Outlook_ComAddIn_Notepad_07

以上で作業は終了です。

Outlookを起動すると、作成したアドインが読み込まれ、受信トレイのアイテムを右クリックしたときのメニューに「Sample Button」(contextMenu要素の子要素であるbutton要素(btnSample))が追加されます。

Build_Outlook_ComAddIn_Notepad_08

以上のように、多少の手間は掛かりますが、メモ帳だけでもOffice用のCOMアドインを作ることができます。
特にOutlookにおいては、他のOfficeアプリケーションに比べてリボンをカスタマイズしづらいので、上記のようなCOMアドインの出番もあるのではないかと思います。

Adobe Acrobat Reader DCのサイレントインストール方法前のページ

[レジストリ]Adobe Acrobat Reader DCの環境設定次のページ

関連記事

  1. Office関連

    VBAでTTSエンジンの各種情報を列挙する

    今回はTTSエンジンの各種情報を列挙するマクロを紹介します。Mic…

  2. Office関連

    マクロに割り当てたショートカットキーをCSVファイルとして出力するWordマクロ

    Word MVPの新田さんが書かれた以下の記事を見て思いついたマクロで…

  3. Office関連

    Office 2013の開発者用リファレンス

    「Word2013 VBA の日本語ヘルプ」でも回答していますが、Of…

  4. Office関連

    古い形式のWordテンプレートを新しい形式に一括変換するVBScript

    古い形式のWordテンプレート(dot)を新しい形式(dotx,dot…

  5. Office関連

    Microsoft Translator APIで文字列を翻訳するVBAマクロ

    以前書いた記事で、Google翻訳を使って文字列を翻訳するマクロを紹介…

コメント

  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

PAGE TOP