| 

.NET C# Java Javascript Exception

3
Ich versuche, ein Addin zu bauen, das sowohl in Word als auch in Excel (und später auch in Powerpoint und Outlook) funktioniert. Dazu habe ich den größten Teil des Codes in eine Klassenbibliothek ausgelagert, die von den Addin-Projekten referenziert wird.

Zu dem Addin gehört ein kleines Ribbon mit ein paar Buttons. Diese Buttons steuern Funktionen in einer TaskPane. Da Word diese TaskPanes pro Fenster verwaltet, muss ich wissen, in welchem Fenster ich mich gerade befinde, wenn der Benutzer einen Button im Ribbon klickt, um die richtige Pane ansprechen zu können. Dazu verlasse ich mich auf die Eigenschaft IRibbonControl.Context. Das funktioniert mit Word wunderbar. In Excel jedoch habe ich das Problem, das IRibbonControl.Context offenbar bei jedem Button-Klick ein neues Objekt liefert. Damit kann mein Addin aber nicht mehr erkennen, dass es sich immer noch um das selbe Fenster handelt (außer Objektidentität habe ich bislang noch nichts gefunden, womit ich einen sinnvollen Vergleich anstellen kann). Was um so kurioser ist, als es in Excel, im Gegensatz zu Word, ja sowieso nur ein Fenster für alle Dokumente gibt. Hat jemand eine Idee, wie sich das lösen läßt, ohne in der Klassenbibliothek Office-Produkt-spezifische Weichen einbauen zu müssen?
News:
05.12.2011
Matthias Hlawatsch 13,2k 4 9
1 Antwort
1
Also, nachdem mich angesichts von

object window = this.Application.ActiveWindow;
object window2 = this.Application.ActiveWindow;
bool areEqual = window == window2; //false!!!

doch arge Zweifel über die Vertrauenswürdigkeit der Excel-Interop-API beschlichen, habe ich beschlossen, das Problem durch eine selbstgestrickte Lösung anzugehen. Statt sich auf IRibbonControl.Context zu verlassen, ruft die Klassenbibliothek jetzt einen Callback aus dem jeweiligen Addin-Projekt. Im Fall von Excel liefert der konstant immer dasselbe, einmal beim Start ermittelte Objekt zurück. Für Word delegiert der Callback zu Application.ActiveWindow. Falls jemand eine bessere Lösung weiß, freue ich mich nach wie vor über alternative Vorschläge.
05.12.2011
Matthias Hlawatsch 13,2k 4 9
Leider kann ich keine Lösung anbieten, da ich von Excel und Word Addins absolut keinen Schimmer hab, aber allein die Tatsache, dass Du diese erschreckende Einsicht mit uns teilst, verdient alle Punkte, die ich vergeben kann.
Hast du diese Interop-Dlls mal mit Reflector/ILSpy aufgemacht und geschaut, was da so abläuft?
Und evtl. mal bei Microsoft Connect, ob da ein Bug offen ist?
ffordermaier 05.12.2011
Bei MS bin ich noch nicht vorstellig geworden. Reflector zeigt nur:

[return: MarshalAs(UnmanagedType.Interface)]
[DispId(0x2f7)]
Window get_ActiveWindow();

D.h. man ist da ganz schnell draußen in der COM-Welt, die sich nicht mehr so leicht ausspionieren läßt - oder?
Matthias Hlawatsch 07.12.2011
Ich hab mal kurz Deinen Code in Excel2010 in VBA ausprobiert. Selbes Ergebnis.

Dim w1, w2 As Object
Set w1 = Application.ActiveWindow
Set w2 = Application.ActiveWindow
Dim b As Boolean
b = w1 Is w2
MsgBox b

Meldung gibt false aus. Langsam glaub ich, dass das ein Feature ist...
ffordermaier 07.12.2011
Was mich ja am meisten aufregt: dass die einzelnen Office-Produkte sich so unterschiedlich verhalten. In Word gibt es eine gleichnamige Eigenschaft, die sich so verhält, wie man das von einer Eigenschaft erwartet. In Outlook ist ActiveWindow eine Methode, liefert aber bei zwei aufeinanderfolgenden Aufrufen trotzdem das selbe Objekt. Oh Mann...
Matthias Hlawatsch 07.12.2011
Ich kann Deinen Frust verstehen, da Deine Erwartungshaltung bezüglich einer Produktfamilie absolut berechtigt ist. Scheint als müsstest Du den Workaround akzeptieren.
In Analogie zu einem ehrwürdigen Prinzip wurde hier wohl etwas verwechselt: "Principle of most astonishment" ;-)
ffordermaier 07.12.2011

Stelle deine Vsto-Frage jetzt!