2

Outlook Interop を使用して、Outlook の受信トレイに接続し、30 通の電子メールを収集してグリッドに表示する小さなアプリを作成しました。グリッド内の電子メールをダブルクリックすると、Outlook で電子メールが開きます。

アプリで: - メールを開き、最小化します。それから別のものを開くと、うまく開きます。- メールを開いて閉じます。次に別のものを開くと、「RPC サーバーが利用できません。(HRESULT からの例外: 0x800706BA)」エラー。

これが発生すると、システム トレイの Outlook アイコンが消えることに気付きました。

Microsoft.Office.Interop.Outlook.Application と名前空間の新しいインスタンスを作成し、ここにあるレジストリ設定を追加しようとしました: http://blogs.msdn.com/b/rgregg/archive/2008/10/27/アプリケーション-シャットダウン-変更-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
4

1 に答える 1

4

数時間の調査の後、メッセージが閉じられると、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
于 2013-11-04T09:09:30.317 に答える