Incapace di oggetto COM fusione - Microsoft Outlook & C #
-
09-10-2019 - |
Domanda
ho scritto questo codice per visualizzare gli elementi non letti nella mia casella di posta di Outlook e qui è il codice:
Microsoft.Office.Interop.Outlook.Application app;
Microsoft.Office.Interop.Outlook.Items items;
Microsoft.Office.Interop.Outlook.NameSpace ns;
Microsoft.Office.Interop.Outlook.MAPIFolder inbox;
Microsoft.Office.Interop.Outlook.Application application = new Microsoft.Office.Interop.Outlook.Application();
app = application;
ns = application.Session;
inbox = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
items = inbox.Items;
foreach (Microsoft.Office.Interop.Outlook.MailItem mail in items)
{
if (mail.UnRead == true)
{
MessageBox.Show(mail.Subject.ToString());
}
}
, ma il ciclo foreach sto ottenendo questo errore:
"Impossibile oggetto getto COM di tipo 'sistema di .__ ComObject' al tipo di interfaccia 'Microsoft.Office.Interop.Outlook.MailItem'. Questa operazione non è riuscita perché la chiamata QueryInterface sul componente COM per l'interfaccia con IID '{00.063.034 -0000-0000-C000-000000000046}' non riuscita a causa del seguente errore: interfaccia non supportata (Eccezione da HRESULT: 0x80004002 (E_NOINTERFACE)) ".
Potete per favore aiutarmi come risolvere questo errore?
Soluzione
ho dovuto andare in giro qualcosa come il problema un po 'indietro.
foreach (Object _obj in _explorer.CurrentFolder.Items)
{
if (_obj is MailItem)
{
MyMailHandler((MailItem)_obj);
}
}
La speranza che aiuta.
Il problema qui è che _explorer.CurrentFolder.Items
può contenere più oggetti che solo MailItem
(PostItem
essere uno di loro).
Altri suggerimenti
provare a controllare la voce è un mailitem
valida prima di controllare le sue proprietà:
foreach (Object mail in items)
{
if ((mail as Outlook.MailItem)!=null && (mail as Outlook.MailItem).UnRead == true)
{
MessageBox.Show((mail as Outlook.MailItem).Subject.ToString());
}
}
Il seguente codice ha funzionato bene quando ho provato. Ma devo dire che il mio riferimento è stato quello di "Microsoft Outlook 14.0 Object Library". Ti capita di usare un'altra versione?
public class Outlook { readonly Microsoft.Office.Interop.Outlook.Items _items; readonly Microsoft.Office.Interop.Outlook.NameSpace _ns; readonly Microsoft.Office.Interop.Outlook.MAPIFolder _inbox; readonly Microsoft.Office.Interop.Outlook.Application _application = new Microsoft.Office.Interop.Outlook.Application(); public Outlook() { _ns = _application.Session; _inbox = _ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox); _items = _inbox.Items; foreach (var item in _items) { string subject= string.Empty; var mail = item as Microsoft.Office.Interop.Outlook.MailItem; if (mail != null) var subject = mail.Subject; else Debug.WriteLine("Item is not a MailItem"); } } }
Si prega di notare che in Outlook, molti articoli hanno alcune proprietà comuni (ad esempio, tempo di scadenza), in modo da poter, come una soluzione disperata, utilizzare un tipo di dati "dinamico" - sia come scenario di ripiego per i tipi di elementi sconosciuti o come predefinito (fino a quando si sta bene con il calo di prestazioni).
Nizza! adattato la soluzione un po ', questo ha funzionato bene per me
foreach (dynamic item in mailItems)
{
if (item is MailItem)
{
Response.Write("Sender: ");
Response.Write(item.SenderEmailAddress);
Response.Write(" - To:");
Response.Write(item.To);
Response.Write("<br>");
}
}