2011-01-11 11 views
12

Ho scritto questo codice per visualizzare gli elementi non letti nella mia casella di posta di Outlook e qui è il codice:Impossibile eseguire il cast oggetto COM - Outlook Microsoft & C#

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 sul ciclo foreach sto ottenendo questo errore:

"Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Interop.Outlook.MailItem'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{00063034-0000-0000-C000-000000000046}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE))."

Potete aiutarmi come risolvere questo errore?

+0

è presente un componente aggiuntivo? – Bolu

+0

@Bolu No, questo è ciò che sto scrivendo nella mia applicazione Windows C# – Zerotoinfinity

+1

MAPIFolder è obsoleto, utilizzare invece Cartella. –

risposta

19

Ho dovuto aggirare qualcosa come il tuo problema un po 'di tempo fa.

 foreach (Object _obj in _explorer.CurrentFolder.Items) 
     { 
      if (_obj is MailItem) 
      { 
       MyMailHandler((MailItem)_obj); 
      } 
     } 

Spero che questo aiuti.

Il problema qui è che _explorer.CurrentFolder.Items può contenere più oggetti rispetto a MailItem (PostItem è uno di questi).

+0

sto ricevendo lo stesso errore sulla riga seguente Microsoft.Office.Interop.Outlook.Application application = new Microsoft.Office.Interop.Outlook .Applicazione(); – Meer

3

Il seguente codice ha funzionato correttamente durante il test. Ma devo menzionare che il mio riferimento era "Libreria di oggetti di Microsoft Outlook 14.0". 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 impostazione predefinita (a condizione che tu stia bene con il colpo di rendimento).

+0

Ho provato lo stesso e ho ricevuto questo messaggio: Impossibile eseguire il cast dell'oggetto COM di tipo 'System .__ ComObject' per interfacciare tipo 'Microsoft.Office.Interop.Outlook.PostItem'. Questa operazione non è riuscita perché la chiamata QueryInterface sul componente COM per l'interfaccia con IID '{00063024-0000-0000-C000-000000000046}' non è riuscita a causa del seguente errore: Nessuna interfaccia supportata (Eccezione da HRESULT: 0x80004002 (E_NOINTERFACE)) . – Zerotoinfinity

+0

Questo ha funzionato per me con Outlook 2016, con l'ultimo Microsoft.Office.Interop.Outlook.dll – Ben

6

tenta di controllare l'articolo è una valida mailitem 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()); 
    } 
}