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