2011-01-11 42 views
12

He escrito el código para ver los elementos no leídos en mi buzón de correo de Outlook y aquí está el código:No se puede convertir objeto COM - Microsoft Outlook & 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()); 
      } 
     } 

pero en el bucle foreach Estoy consiguiendo este error:

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

¿Me puede ayudar a resolver este error?

+0

es este un complemento? – Bolu

+0

@Bolu No, esto es lo que estoy escribiendo en mi aplicación C# Windows – Zerotoinfinity

+1

MAPIFolder está en desuso, use la carpeta en su lugar. –

Respuesta

19

Tuve que solucionar algo así como su problema hace un tiempo.

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

Espero que ayude.

El problema aquí es que _explorer.CurrentFolder.Items puede contener más objetos que solo MailItem (PostItem es uno de ellos).

+0

obtengo el mismo error en la siguiente línea Microsoft.Office.Interop.Outlook.Application application = new Microsoft.Office.Interop.Outlook .Solicitud(); – Meer

3

El siguiente código funcionó bien cuando lo probé. Pero debo mencionar que mi referencia fue a "Microsoft Outlook 14.0 Object Library". ¿Utilizas otra versión?

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

Tenga en cuenta que en Outlook, muchos artículos tienen algunas propiedades comunes (por ejemplo, tiempo de expiración), por lo que puede, como una solución desesperada, utilice un tipo de datos "dinámico" - ya sea como un escenario de reserva para los tipos de elementos desconocidos o como tu predeterminado (siempre y cuando estés bien con el golpe de rendimiento).

+0

Intenté lo mismo y recibí este mensaje: No se pudo convertir el objeto COM de tipo 'System .__ ComObject' al tipo de interfaz 'Microsoft.Office.Interop.Outlook.PostItem'. Esta operación falló porque la llamada a QueryInterface en el componente COM para la interfaz con IID '{00063024-0000-0000-C000-000000000046}' falló debido al siguiente error: No se admitió dicha interfaz (Excepción de HRESULT: 0x80004002 (E_NOINTERFACE)) . – Zerotoinfinity

+0

Esto funcionó para mí con Outlook 2016, con el último Microsoft.Office.Interop.Outlook.dll – Ben

6

intenta comprobar que el artículo es una válida mailitem antes de comprobar sus propiedades:

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()); 
    } 
} 
Cuestiones relacionadas