使用 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