2015-08-11 20 views
7

Şu anda Microsoft Outlook için C# .NET Eklentisi üzerinde çalışıyorum. Eklenti'nin amacı, arama girişini Outlook Instant Search'ten yakalamak ve bir Özel Bölmede kendi arama sonuçlarında göstermektir.Yerel Pencere: Serbest Bırakma Kolu Açık

Oldukça iyi çalışıyor ve Outlook Penceresini Yerel Pencereyle alt sınıflara ayırmak için arama dizesini alıyorum ve bunu zaten panelime aktarıyorum.

sorun (via "Dosya-> Seçenekler> Add-Ins-'den> COM eklentiler" bölmesinde X ile ancak değil) Add-In kapattığınızda o, şimdi Eklenti anında sonlandırılır ve WndProc zincirimi geri yüklemek için önce searchboxWindow.ReleaseHandle()'u arayamıyorum. Outlook, görünür bir hata olmadan çöküyor.

protected override void WndProc(ref Message m) 
{ 
    base.WndProc(ref m); 

    switch ((uint)m.Msg) 
    { 
     case WindowMessages.WM_DESTROY: 
     case WindowMessages.WM_QUIT: 
     case WindowMessages.WM_NCDESTROY: 
      this.ReleaseHandle(); 
      return; 

     case WindowMessages.WM_KEYUP: 
     case WindowMessages.WM_LBUTTONDOWN: 
     case WindowMessages.WM_RBUTTONDOWN: 
      OnKeyUp(); 
      break; 

     case WindowMessages.WM_EXITSIZEMOVE: 
      OnResize(); 
      break; 
    } 
} 

Zaten Eklenti kapalı çağrılacak gereken birkaç pencere Mesajları dinlemeye çalıştım, ama normal bir şekilde Outlook kapattığınızda bu mesajlar sadece görünür. Ayrıca, AppDomain.CurrentDomain.ProcessExit, this.Shutdown veya ((Outlook.ApplicationEvents_10_Event)this.Application).Quit gibi ana Eklenti kaynak dosyasındaki olaylar çağrılmadı.

Eklenti sona erdiğinde (güvenilir bir şekilde) işten çıkaracağım hangi olayı dinleyebilirim? Biraz var mı? Eğer değilse, benim problemimi çözmek için hangi alternatifler var?

+0

Dipose() yöntemini denediniz mi ve Dipose olayına bir yöntem eklediniz mi? –

+0

IDisposable arabirimini uyguladı ve orada ReleaseHandle() olarak adlandırdım, ancak hiçbir etkisi olmadı? Demek istediğin bu mu? –

+3

Pencerenin alt sınıfını kaldırmak için eklentinizin Kapatma olayını kullanın. Otomatik oluşturulan ThisAddIn_Shutdown() olay işleyicisi korkunç bir dile sahiptir, ancak bu belirli senaryoda hala yükseltilmiştir. –

cevap

1

ÇÖZÜLDÜ: Teşekkür Hans Passant

O gerçekten Eklenti elle COM eklentileri iletişim kutusu aracılığıyla kesmek olduğunda ThisAddIn_Shutdown Olay tetiklenir gibi görünüyor.

0

Yönetilen kodda yapabileceğiniz çok şey olduğunu sanmıyorum. İşlenmemiş kodlar iyi çalışırdı; COM sistemi, dll'nizin DllCanUnload uygulamanızı çağırarak kaldırılıp kaldırılamayacağını kibarca sorar.

+0

projemi C++ veya benzer bir şekilde yeniden yazana kadar temelde hiçbir şey yapamam. –

+0

Yönetilen kodda bunu yapmanın bir yolunu düşünemiyorum. –