Outlook.Application - Der RPC-Server ist nicht verfügbar.

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von FredM.

    Outlook.Application - Der RPC-Server ist nicht verfügbar.

    Hallo,

    ich arbeite gerade an einem kleinen Tool für Microsofts Outlook 2010.
    Ich habe eine Funktion geschrieben mit der ich überprüfe ob Outlook bereits läuft und wenn ja das Objekt zuordnet, oder wenn nein, Outlook startet.
    Das funktioniert ganz gut, wird allerdings Outlook zur Laufzeit vom Benutzer geschlossen und dann wieder gestartet bekomme ich folgende Fehlermeldung: "Der RPC-Server ist nicht verfügbar"
    Es scheint als würde etwas noch nicht ganz klappen mit dem zuordnen des laufenden Prozesses in die Variable outlook. :wacko:

    Programm starten (Outlook läuft bereits) funktioniert...
    Programm starten, Outlook starten, funktioniert...
    Programm starten, Outlook starten, Outlook schließen, Outlook starten -> RPC-Server nicht verfügbar

    VB.NET-Quellcode

    1. Dim outlook As Outlook.Application
    2. Sub machwas()
    3. If app_running("OUTLOOK", True) = True Then
    4. Dim contact As Outlook.ContactItem
    5. Dim ns As Outlook.NameSpace = Nothing
    6. ..........
    7. End If
    8. End Sub
    9. Function app_running(ByVal Application As String, Optional ByVal start_app As Boolean = False) As Boolean
    10. Dim Process() As System.Diagnostics.Process = System.Diagnostics.Process.GetProcessesByName(Application)
    11. If Process.Length > 0 Then
    12. outlook = System.Runtime.InteropServices.Marshal.GetActiveObject("Outlook.Application")
    13. Return True
    14. Else
    15. If start_app = True Then
    16. outlook = New Outlook.Application
    17. Return True
    18. Else
    19. Return False
    20. End If
    21. End If
    22. End Function
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FredM“ ()

    Hi,

    wenn du einen RCW für ein Objekt aus der ROT abrufst, erhälst du keine Kopie des Objekts, sondern einen Verweis darauf. Das erhöht intern den Verweiszähler für das COM-Objekt, sodass der Outlook-Prozess nicht beendet wird, wenn der User das Fenster schließt (denn es existiert noch ein Verweis auf die Instanz in deinem Programm). Sehen kannst du das schön im Taskmanager: Starte Outlook, verbinde dein Programm zur laufenden Instanz und schließe dann das Outlook-Fenster. Der Outlook-Prozess im Taskmanager wird nicht verschwinden. Wenn du Outlook nun neu startest, erscheint ein zweiter Prozess im Taskmanager. Deine Methode ruft wieder erfolgreich einen RCW ab - aber das ist der falsche, denn die ROT wird üblicherweise von oben nach unten durchlaufen, und da der Marshaller den ersten passenden Eintrag zurückliefert, bekommst du einen RCW für die alte Instanz, die überdies nicht mehr funktionstüchtig ist (warum weiß ich nicht).

    Du musst also deine alte Instanz freigeben, bevor du eine neue abrufst. Das sollte auch den "alten" Prozess beenden, sodass du direkt die neue Instanz bekommst. Vielleicht reicht es schon, auf Process.Count > 1 zu prüfen (den Variablenname ist übrigens schlecht gewählt). Andernfalls musst du die ROT auflisten, die richtige Instanz suchen und dann manuell abrufen. Siehe dazu (teilweise): svn2.assembla.com/svn/bYDhi8Pa…k/DvdAutoplay/Autoplay.cs.
    Gruß
    hal2000
    Ich hab gerade gemerkt, dass es gar nicht ganz korrekt war was ich geschrieben habe.

    Ich habe es im Task-Manager überwacht, es befindet sich immer nur ein Prozess in der Liste, es kommt nie dazu dass 2 Outlook prozesse vorhanden sind.

    Programm starten (Outlook läuft bereits) funktioniert...
    Programm starten, Outlook starten (von Hand über das Startmenü) -> funktioniert NICHT HRESULT: 0x800401E3
    Programm starten, Outlook starten über Funktion -> funktioniert
    Programm starten, Outlook starten, Outlook schließen (von Hand), Outlook starten (von Hand) -> funktioniert NICHT HRESULT: 0x800401E3
    Bilder
    • outlook.png

      65,19 kB, 789×412, 190 mal angesehen
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    FredM schrieb:

    es kommt nie dazu dass 2 Outlook prozesse vorhanden sind

    Dann verhält sich Outlook nicht wie Excel :) . Davon war ich einfach mal ausgegangen.

    Der Fehler scheint viel trivialer: Siehe support.microsoft.com/kb/238610/en-us. Nach diesem Artikel trägt sich Outlook erst in die ROT ein, wenn das Fenster mal den Fokus verloren hat.
    Auch interessant: blogs.msdn.com/b/andreww/archi…cting-to-office-apps.aspx
    Außerdem habe ich auf Stackoverflow gelesen, dass VisualStudio und Outlook unter Windows 7 nicht mit verschiedenen Verbindlichkeitsstufen laufen dürfen, damit du eine Instanz abrufen kannst. Falls VS bei dir mit Adminrechten läuft, kann es auch daran liegen.
    Gruß
    hal2000
    ja das mit dem fokus passt sehr gut zu meinen Beobachtungen, wenn man hin und her klickt zw. den beiden fenstern funktioniert es.
    dann werd ich mal versuchen ob das hilft :)

    VB.NET-Quellcode

    1. Me.Activate()
    2. Threading.Thread.Sleep(50)
    3. outlook_app = System.Runtime.InteropServices.Marshal.GetActiveObject("Outlook.Application")


    Einfach die zwei Zeilen vor den Code und schon klappts, danke :)
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FredM“ ()