2011-01-11 10 views
12

ja napisałem ten kod, aby zobaczyć nieprzeczytane elementy w moim perspektywicznej skrzynki pocztowej i oto kod:Nie można rzutować obiektu 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()); 
      } 
     } 

ale na pętli foreach jestem coraz to błąd:

"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))."

Czy możesz pomóc mi rozwiązać ten błąd?

+0

jest ten dodatek? – Bolu

+0

@Bolu Nie, to jest to, co piszę w mojej aplikacji C# Windows. – Zerotoinfinity

+1

Mapifolder jest przestarzały, zamiast niego użyj Folder. –

Odpowiedz

19

musiałem ominąć coś podobnego problemu, natomiast tył.

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

Nadzieję, że pomaga.

Kwestia jest taka, że ​​_explorer.CurrentFolder.Items może zawierać więcej obiektów niż tylko MailItem (PostItem będąc jednym z nich).

+0

Otrzymuję ten sam błąd na następującej linii Microsoft.Office.Interop.Outlook.Application application = new Microsoft.Office.Interop.Outlook .Podanie(); – Meer

3

Poniższy kod działał dobrze, gdy testowałem. Ale muszę wspomnieć, że moje odniesienie było do "Biblioteki obiektów Microsoft Outlook 14.0". Czy używasz innej wersji?

 
    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"); 
     } 
    } 
    } 

Należy pamiętać, że w programie Outlook, wiele elementów mają pewne wspólne właściwości (np czas ważności), więc można, jako rozpaczliwą obejść ten problem, użyj „dynamiczny” typu danych - zarówno jako awaryjny scenariusz dla nieznanych typów elementów lub jako domyślne (o ile wszystko w porządku z trafieniem wydajności).

+0

Próbowałem tego samego i otrzymałem następujący komunikat: Nie można rzucić obiektu COM typu "System .__ ComObject" do typu interfejsu "Microsoft.Office.Interop.Outlook.PostItem". Ta operacja nie powiodła się, ponieważ wywołanie QueryInterface na komponencie COM interfejsu z IID "{00063024-0000-0000-C000-000000000046}" nie powiodło się z powodu następującego błędu: Brak takiego interfejsu obsługiwanego (Wyjątek od HRESULT: 0x80004002 (E_NOINTERFACE)) . – Zerotoinfinity

+0

To działało dla mnie z Outlookiem 2016, z najnowszym Microsoft.Office.Interop.Outlook.dll – Ben

6

spróbować sprawdzić element jest ważny mailitem przed sprawdzeniem jego właściwości:

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()); 
    } 
} 
Powiązane problemy