使用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
答案 0 :(得分:4)
经过几个小时的调查,当邮件关闭时,它会关闭Outlook。
解决方案是在与Outlook交互之前检查Outlook是否已打开。如果Outlook关闭,每隔2分钟运行一次运行相同检查的计时器,确保我创建的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