This project has moved. For the latest updates, please go here.

Das Problem:

In manchen Situationen kann es Ihnen passieren das eine Office Anwendung den programmatischen Zugriff ablehnt, in diesem Fall bekommen Sie typischerweise eine RPC_E_CALL_REJECTED Exception. Gründe hierfür können sein das die Office Anwendung gerade ausgelastet ist oder sich in einem Zustand befindet in dem ein programmatischer Zugriff nicht erlaubt ist. Für Microsoft Excel gilt dies z.B. wenn der Anwender eine Zellenformel bearbeitet. Während der Bearbeitung im Formel-Editor ist ein programmatischer Zugriff nicht erlaubt.

Im Alltag des Office-Entwicklers sind es vor allem unvorsehbare Auslastungszustände der jeweiligen Office Anwendung die für einiges Kopfzerbrechen sorgen können. Ein möglicher Weg diesem Problem zu begegnen sind sogenannte Zeitfedern, d.h. man gibt der Office Anwendung ein wenig Zeit und probiert es dann nochmal. In den gängigen Entwicklerforen finden sich viele Posts dazu.(Zum Beispiel
hier)  

Die Lösung:

Ein MessageFilter ist ein Vermittler der im Fall von abgelehnten Aufrufen(RPC_E_CALL_REJECTED) definiert wie Sie darauf reagieren möchten. Eine technische Einführung dazu finden Sie
hier. Sie können den MessageFilter beispielsweise anweisen einen abgelehnten Aufruf zu wiederholen oder auch mit einer Verzögerung zu wiederholen. Sie müssen ihren bestehenden Code dafür nicht ändern und bekommen eine höhere Ausfallsicherheit gegen Auslastungszustände der Office Anwendung. NetOffice bringt eine fertige MessageFilter Implementierung bereits mit. 


Übersicht - NetOffice.Settings.MessageFilter

Eigenschaft Beschreibung Default
Enabled Schaltet den MessageFilter ein oder aus. false
RetryMode Bestimmt das Verhalten des MessageFilters bei abgelehnten Aufrufen. Immediately – Der Aufruf wird sofort wiederholt
LogMode Bestimmt ob der MessageFilter Einträge in der NetOffice.DebugConsole vornimmmt. None



Beispielaufruf in Visual Basic

NetOffice.Settings.MessageFilter.Enabled = True

' set few milliseconds delay for retry 
NetOffice.Settings.MessageFilter.RetryMode = NetOffice.RetryMessageFilterMode.Delayed

 

Beispielaufruf in C# 

NetOffice.Settings.MessageFilter.Enabled = true;

// set few milliseconds delay for retry 
NetOffice.Settings.MessageFilter.RetryMode = NetOffice.RetryMessageFilterMode.Delayed;

Last edited Oct 6, 2012 at 9:43 PM by SebastianDotNet, version 13

Comments

No comments yet.