Невозможно запустить объект COM - Microsoft Outlook и С#
Я написал этот код для просмотра непрочитанных элементов в моем почтовом ящике Outlook и вот код:
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());
}
}
но в цикле foreach я получаю эту ошибку:
"Невозможно передать COM-объект типа" System.__ ComObject "в тип интерфейса" Microsoft.Office.Interop.Outlook.MailItem ". Эта операция завершилась неудачно, потому что вызов QueryInterface для COM-компонента для интерфейса с IID '{00063034 -0000-0000-C000-000000000046} 'не удалось из-за следующей ошибки: такой интерфейс не поддерживается (исключение из HRESULT: 0x80004002 (E_NOINTERFACE)).
Не могли бы вы помочь мне решить эту ошибку?
Ответы
Ответ 1
Мне пришлось некоторое время обойти что-то вроде вашей проблемы.
foreach (Object _obj in _explorer.CurrentFolder.Items)
{
if (_obj is MailItem)
{
MyMailHandler((MailItem)_obj);
}
}
Надеюсь, что это поможет.
Проблема здесь в том, что _explorer.CurrentFolder.Items
может содержать больше объектов, чем просто MailItem
(PostItem
является одним из них).
Ответ 2
попробуйте проверить, что элемент является действительным mailitem
, прежде чем проверять его свойства:
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());
}
}
Ответ 3
Следующий код работал нормально, когда я его тестировал. Но я должен упомянуть, что моя ссылка была на "Microsoft Outlook 14.0 Object Library". Вы используете другую версию?
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");
}
}
}
Обратите внимание, что в Outlook многие элементы имеют некоторые общие свойства (например, время истечения срока действия), поэтому в качестве отвратительного обходного пути вы можете использовать "динамический" тип данных - либо в качестве резервного сценария для неизвестных типов элементов, либо как ваш по умолчанию (пока вы в порядке с ударом производительности).