2013-02-05 94 views
2

我正在開發一個Outlook Addin,它使用Web服務進行身份驗證以從數據庫中獲取數據並將數據存儲在數據庫中。 當插件啓動時,它會查詢Web服務,以找出是否安裝了插件的版本是最新版本,如果不是那麼它通過以編程方式禁用Outlook Addin

Application.COMAddIns.Item("foo").Connect = false; 

方式卸載插件從Outlook爲了查詢網服務必須通過身份驗證。憑據從Windows註冊表中的加密字符串中檢索。這些憑據來自Form對象,該對象在插件啓動時或每當對Web服務進行查詢時都運行,並且無法從註冊表中檢索用戶名和/或密碼,通常是由於某人刪除了所述值。

無論何時保存憑證,都會使用這些憑據來查詢Web服務,以檢查插件是否是正確的版本。如果不是,那麼COM插件將與Outlook斷開連接。

每當爲其他目的查詢Web服務時,首先會查詢插件是否是正確的版本。如果不是,那麼COM插件將與Outlook斷開連接。

據我所知斷開插件只能從Outlook.Application對象,我迄今只能夠從我的Addin對象訪問。

我需要弄清楚的是,當我不在我的Addin對象中時,如何斷開Outlook Addin或禁用它?

回答

2

我設法通過功能區的背景下訪問COM對象,所以我解決了這一切通過建立一個公共靜態方法,它接受COMAddIn對象作爲參數,並從那裏我可以做任何我想做的:)

Microsoft.Office.Core.COMAddIns comaddins = ((this.Context as Outlook.Explorer).Application.COMAddIns.Application as Outlook.Application).COMAddIns; 

靜態方法是這樣的:

public static void ThisAddIn_CheckVersion(Microsoft.Office.Core.COMAddIn ThisAddIn) 
    { 
     var rk = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Office\\Outlook\\Addins\\My Outlook Add-in"); 
     if (rk.GetValue("Username") == null || rk.GetValue("Password") == null) 
     { 
      new EditSettingsForm(ThisAddIn).Show(); 
      return; 
     } 

     var sc = new MyWebService.WebServiceClient(); 
     sc.ClientCredentials.UserName.UserName = (rk.GetValue("Username") == null ? null : rk.GetValue("Username").ToString()); 
     sc.ClientCredentials.UserName.Password = (rk.GetValue("Password") == null ? null : Encryptor.Decrypt(rk.GetValue("Password").ToString())); 

     if (sc.GetMyOutlookAddinVersionNumber() != "TESTING") 
     { 
      System.Windows.Forms.MessageBox.Show("The version of My Outlook 2013 Add-in you're using is too old. Please update to the latest version at http://www.foo.bar/"); 
      ThisAddIn.Connect = false; 
     } 

     sc = null; 
    } 

到所有加載項的引用可以通過功能區的這樣的Context屬性中引用