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関連

    [Word]隠し文字をクイックアクセスツールバーから設定する。

    Wordで、部分的に印刷したくない文字列がある場合には「隠し文字」がよ…

  2. リボン関連

    Re: Excel 2013のデザインタブはどこに?

    「インストラクターのネタ帳」で有名なExcel MVPの伊藤さんが「E…

  3. Office関連

    ディスプレイのサイズを取得するVBAマクロ

    「VBA ディスプレイ 幅 高さ」といったキーワード検索でのアクセスが…

  4. Office関連

    [Office]WordやPowerPointで画像の画質が悪くなった時の対処方法

    WordやPowerPointで画像を貼りつけたときやファイルを保存し…

  5. Office関連

    Google Docs APIを使ってGoogle ドキュメントを操作するVBAマクロ

    前回の記事で新しく追加されたGoogle Docs APIを紹介しまし…

  6. Office関連

    goo.glで短縮URLを取得するVBAマクロ

    何年か前にHPで「goo.glで短縮URLを取得する」マクロを紹介しま…

コメント

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

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

Time limit is exhausted. Please reload CAPTCHA.

※本ページはプロモーションが含まれています。

Translate

最近の記事

アーカイブ

PAGE TOP