打开电子邮件时的 Outlook 互操作"The RPC server is unavailable"



使用 Outlook Interop,我创建了一个小应用程序来连接到我的 Outlook 收件箱并收集 30 封电子邮件,然后将它们显示在网格中。当您双击网格中的电子邮件时,它将在Outlook中打开该电子邮件。

在应用中:- 打开一封电子邮件,将其最小化。然后打开另一个,它会打开正常。- 打开一封电子邮件,关闭它。然后打开另一个,你会得到一个"RPC服务器不可用。(HRESULT的例外情况: 0x800706BA)' 错误。

我注意到发生这种情况时,系统托盘中的Outlook图标会消失。

我尝试创建 Microsoft.Office.Interop.Outlook.Application 和命名空间的新实例,并添加在此处找到的注册表设置:http://blogs.msdn.com/b/rgregg/archive/2008/10/27/application-shutdown-changes-in-outlook-2007-service-pack-2-beta.aspx

我正在运行 Office 2010。

有谁知道如何解决这个问题?

Imports Microsoft.Office.Interop.Outlook
Imports System.Runtime.InteropServices
Imports System.Reflection
Public Class Form1
    Private m_outlookApplication As Application                                                         'Outlook
    Private m_nameSpace As Microsoft.Office.Interop.Outlook.NameSpace                                   'Outlook's namespace
    Private WithEvents m_inboxItems As Items                                                            'All Outlook inbox items
    Private WithEvents m_calendarItems As Items                                                         'All Outlook calendar items
    Private m_outlookInstalled As Boolean = False                                                       'indicates whether Outlook is installed on computer
    Private m_emails As New List(Of OutlookInboxEmail)                                                  'used to store inbox e-mail messages for grid view control
    Private m_inboxFolder As MAPIFolder                                                                 'Outlook inbox folder
    Private m_calendarFolder As MAPIFolder                                                              'Outlook calendar
    Private m_explorer As Explorer                                                                      'Outlook window explorer
    Private m_name As String = String.Empty                                                             'the name user who is connected
    Public Sub New()
        InitializeComponent()
        connectToOutlook()
        loadInbox()
    End Sub
    Private Sub connectToOutlook()
        m_outlookApplication = New Microsoft.Office.Interop.Outlook.Application
        m_nameSpace = m_outlookApplication.GetNamespace("MAPI")
        m_nameSpace.Logon(Missing.Value, Missing.Value, False, True)
        Dim connectionMode = m_nameSpace.ExchangeConnectionMode
    End Sub
    Private Sub loadInbox()
        Try
            'get inbox folder
            m_inboxFolder = m_nameSpace.GetDefaultFolder(OlDefaultFolders.olFolderInbox)
            'get inbox messages
            m_inboxItems = m_inboxFolder.Items
            m_emails.Clear()
            'display recent messages first
            m_inboxItems.Sort("ReceivedTime", True)
            Dim numberOfEmailsToLoad As Integer = 30
            'set displayed values for each message
            For Each currentItem As Object In m_inboxItems
                Dim emailItem = TryCast(currentItem, MailItem)
                If Not emailItem Is Nothing Then
                    'check whether its e-mail
                    If emailItem.MessageClass = "IPM.Note" Then
                        'set email
                        Dim inboxEmail As New OutlookInboxEmail
                        inboxEmail.SenderName = emailItem.SenderName
                        inboxEmail.Subject = emailItem.Subject
                        inboxEmail.ReceivedTime = emailItem.ReceivedTime.ToString("dd MMMM HH:mm")
                        inboxEmail.Body = emailItem.Body
                        inboxEmail.Unread = emailItem.UnRead
                        inboxEmail.Email = emailItem
                        m_emails.Add(inboxEmail)
                        numberOfEmailsToLoad = numberOfEmailsToLoad - 1
                        If numberOfEmailsToLoad <= 0 Then
                            Exit For
                        End If
                    End If
                End If
            Next
            If m_explorer Is Nothing Then
                Try
                    m_explorer = m_outlookApplication.ActiveExplorer
                Catch ex As System.Exception
                End Try
            End If
            If GridControl1.DataSource Is Nothing Then
                GridControl1.DataSource = Nothing
                GridControl1.DataSource = m_emails
            End If
            GridControl1.RefreshDataSource()
        Catch exception As System.Exception
        End Try
    End Sub
    ''' <summary>
    ''' Opens email in Outlook
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub openEmail()
        If Not GridView1.GetFocusedDataSourceRowIndex < 0 Then
            Dim selectedEmail = TryCast(m_emails(GridView1.GetFocusedDataSourceRowIndex), OutlookInboxEmail)
            If Not selectedEmail Is Nothing Then
                Try
                    If Process.GetProcessesByName("OUTLOOK").Count() = 0 Then
                    End If
                    selectedEmail.Email.Display()
                    selectedEmail.Unread = False
                    selectedEmail.EmailImage = My.Resources.Read_16
                Catch exception As COMException
                End Try
                GridControl1.RefreshDataSource()
            End If
        End If
    End Sub
    Private Sub GridControlCalendar_DoubleClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles GridControl1.DoubleClick
        openEmail()
    End Sub
End Class

经过几个小时的调查,当邮件关闭时,它会关闭 Outlook。

解决方案是在与Outlook交互之前检查Outlook是否打开。每 2 分钟运行一次运行相同检查的计时器可确保我创建的 Outlook 收件箱视图在 Outlook 关闭时仅过期 2 分钟。

Private Sub openEmail()
        If Not GridViewInbox.GetFocusedDataSourceRowIndex < 0 Then
            Dim selectedEmail = TryCast(m_emails(GridViewInbox.GetFocusedDataSourceRowIndex), OutlookInboxEmail)
            If Not selectedEmail Is Nothing Then
                Try
                    If Process.GetProcessesByName("OUTLOOK").Count() = 0 Then
                        'if outlook is not open.. open it
                        m_selectedEmail = selectedEmail
                        reconnectOutlook()
                    Else
                        'as outlook is open, open the email
                        selectedEmail.Email.Display()
                        selectedEmail.Unread = False
                        selectedEmail.EmailImage = ImageLibrary.My.Resources.Read_16
                        GridControlInbox.RefreshDataSource()
                        m_selectedEmail = Nothing
                    End If
                Catch exception As COMException
                    EventLog.write(exception)
                    MessageBox.Show("Could not open email. Please start Outlook and try again.", "Opening Email", MessageBoxButtons.OK, MessageBoxIcon.Information)
                End Try
                GridControlInbox.RefreshDataSource()
            End If
        End If
    End Sub

重新连接代码...

Private Sub connectToOutlook()
    Try
        m_outlookApplication = New Microsoft.Office.Interop.Outlook.Application
        m_nameSpace = m_outlookApplication.GetNamespace("MAPI")
        'start Outlook
        Dim connectionMode = m_nameSpace.ExchangeConnectionMode
        m_nameSpace.Logon(Missing.Value, Missing.Value, False, True)
        'get the name of user
        m_name = m_outlookApplication.Session.CurrentUser.Name
        m_outlookInstalled = True
    Catch exception As System.Exception
        If Not exception.Message.IndexOf("Class not registered") = -1 Then
            'Outlook is not installed
            m_outlookInstalled = False
            EventLog.write(exception)
        Else
            EventLog.write(exception)
        End If
    End Try
End Sub

相关内容

最新更新