2015-08-11 18 views
7

Ich arbeite derzeit an einem C# .NET Add-In für Microsoft Outlook. Das Ziel des Add-Ins ist, die Sucheingabe von der Outlook-Sofortsuche zu erfassen und in einem benutzerdefinierten Fenster meine eigenen Suchergebnisse anzuzeigen.Natives Fenster: Freigabe-Handle beim Schließen

Es funktioniert ziemlich gut, und mit Subclassing das Outlook-Fenster mit einem Native Window, erhalte ich die Suchzeichenfolge, und es übergibt das bereits in meinem Panel.

Das Problem ist jetzt, dass, wenn Sie die Add-In zu schließen (über "File-> Optionen-> Add-Ins-> COM-Add-In", aber nicht mit der X in der Scheibe) , das Add-In wird sofort beendet und ich kann searchboxWindow.ReleaseHandle() nicht vorher aufrufen, um meine WndProc-Kette wiederherzustellen. Outlook stürzt einfach ohne sichtbare Fehler ab.

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; 
    } 
} 

Ich habe bereits versucht, auf ein paar Fensternachricht zu hören, die, wenn die Add-In geschlossen wird aufgerufen werden sollen, aber diese Meldungen erscheinen nur, wenn ich die Outlook in einer normalen Art und Weise zu schließen. Die Ereignisse in der Haupt-Add-In-Quelldatei wie AppDomain.CurrentDomain.ProcessExit, this.Shutdown oder ((Outlook.ApplicationEvents_10_Event)this.Application).Quit werden nicht aufgerufen.

Welches Ereignis kann ich abhören, das (zuverlässig) ausgelöst wird, wenn das Add-In beendet wird? Sind dort welche? Wenn nicht, welche Alternativen habe ich, um mein Problem zu lösen?

+0

Haben Sie Dipose() versucht und eine Methode an das Diposed-Ereignis angehängt, um sicherzustellen, dass sie tatsächlich entsorgt wurde? –

+0

Ich implementierte die IDisposable-Schnittstelle und nannte die ReleaseHandle() dort, aber es hatte keine Auswirkungen? Meinst Du das? –

+3

Verwenden Sie das Shutdown-Ereignis Ihres Add-Ins, um das Fenster von der Unterklasse zu entfernen. Der automatisch generierte Event-Handler ThisAddIn_Shutdown() hat eine gruselige Sprache, wird aber in diesem speziellen Szenario immer noch angesprochen. –

Antwort

1

GELÖST: Dank Hans Passant

Es scheint wirklich, dass die ThisAddIn_Shutdown Ereignis ausgelöst wird, wenn das Add-In manuell über die COM trennen ist Add-Ins-Dialogfeld.

0

Ich glaube nicht, dass Sie im verwalteten Code viel tun können. Unbeschädigter Code hätte gut funktioniert; Das COM-System fragt Sie höflich, ob Ihre DLL entladen werden kann, indem Sie Ihre Implementierung von DllCanUnload aufrufen.

+0

So Grundsätzlich kann ich nichts machen, bis ich mein Projekt in C++ oder ähnliches umgeschrieben habe? –

+0

Ich kann mir keinen Weg vorstellen, dies in verwaltetem Code zu tun. –