【问题标题】:Unable to cast COM object - Microsoft outlook & C#无法转换 COM 对象 - Microsoft Outlook 和 C#
【发布时间】:2011-06-07 01:57:24
【问题描述】:

我已经编写了这段代码来查看我的 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 循环中我收到此错误:

“无法将类型为“System.__ComObject”的 COM 对象转换为接口类型“Microsoft.Office.Interop.Outlook.MailItem”。此操作失败,因为对具有 IID 的接口的 COM 组件调用 QueryInterface '{00063034 -0000-0000-C000-000000000046}' 由于以下错误而失败:不支持此类接口(来自 HRESULT 的异常:0x80004002 (E_NOINTERFACE))。”

您能帮我解决这个错误吗?

【问题讨论】:

  • @Bolu 不,这是我在 c# Windows 应用程序中写的内容
  • MAPIFolder 已弃用,请改用 Folder。
  • 你解决这个问题了吗?
  • 此错误与更改Office版本一致。 (它会产生一系列问题)需要做的是编辑一些注册表文件,如下所述:stackoverflow.com/questions/12957595/…

标签: c# outlook c#-2.0 office-interop outlook-2003


【解决方案1】:

不久前我不得不解决类似你的问题。

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

希望对您有所帮助。

这里的问题是_explorer.CurrentFolder.Items 可以包含更多的对象,而不仅仅是MailItem(PostItem 是其中之一)。

【讨论】:

  • 我在以下行 Microsoft.Office.Interop.Outlook.Application application = new Microsoft.Office.Interop.Outlook.Application(); 上遇到了同样的错误;
【解决方案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”。你碰巧用的是其他版本吗?

    公开课展望 { 只读 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(); 公共展望() { _ns = _application.Session; _inbox = _ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox); _items = _inbox.Items; foreach(_items 中的变量项) { 字符串主题=字符串。空; var mail = 作为 Microsoft.Office.Interop.Outlook.MailItem 的项目; 如果(邮件!= null) var 主题 = 邮件。主题; 别的 Debug.WriteLine("Item 不是 MailItem"); } } }

    请注意,在 Outlook 中,许多项目都有一些共同的属性(例如过期时间),因此作为一种绝望的解决方法,您可以使用“动态”数据类型 - 作为未知项目类型的后备方案或作为您的默认值(只要你对性能影响没问题)。

    【讨论】:

    • 我尝试了同样的方法并收到了这条消息:无法将“System.__ComObject”类型的 COM 对象转换为接口类型“Microsoft.Office.Interop.Outlook.PostItem”。此操作失败,因为 IID 为“{00063024-0000-0000-C000-000000000046}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(来自 HRESULT 的异常:0x80004002 (E_NOINTERFACE)) .
    • 这适用于我的 Outlook 2016,带有最新的 Microsoft.Office.Interop.Outlook.dll
    【解决方案4】:

    不错!稍微调整一下解决方案,这对我来说效果很好

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

    【讨论】:

    • 您是否从服务 (IIS) 访问 OOM?不要那样做。
    猜你喜欢
    • 2011-08-17
    • 2018-11-16
    • 1970-01-01
    • 2011-10-29
    • 2017-11-10
    • 1970-01-01
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    相关资源
    最近更新 更多