【问题标题】:Getting exception while extracting Attachment from Lotus Notes(.nsf) file through C# code通过 C# 代码从 Lotus Notes(.nsf) 文件中提取附件时出现异常
【发布时间】:2014-07-23 19:17:36
【问题描述】:

在 foreach 循环中将 itemA 对象转换为 Notesitem 时遇到异常,有人可以帮助我吗?

无法将“System.__ComObject”类型的 COM 对象转换为接口类型“Domino.NotesItem”。此操作失败,因为 IID 为“{2913158A-2EED-1069-BF5D-00DD011186B7}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(来自 HRESULT 的异常:0x80004002 (E_NOINTERFACE)) .在 WindowsApplication2.Form1.btnSearch_Click(Object sender, EventArgs e) in C:\WindowsApplication2\WindowsApplication2\Form1.cs:line 319}

我正在使用 Interop.Domino.dll 和代码:

        NotesSession session = new NotesSession();
        session.Initialize("XXXXXX");
        try
        {
            NotesDatabase NotesDb = session.GetDatabase("", "C:\LotusFiles\\XYZ.nsf", false);

            if (NotesDb == null)
            {
                //System.Console.WriteLine("Can not connect to server.");
            }
            else
            {
                //System.Console.WriteLine("Connected");
            }

            Domino.NotesDocumentCollection col = NotesDb.AllDocuments;
            for (int i = 0; i < col.Count; ++i)
            {
                Domino.NotesDocument doc = col.GetNthDocument(i);

                if (doc.HasEmbedded)
                {
                    object[] itemsA = (object[])doc.Items;
                    foreach (NotesItem item in itemsA)
                    {
                        if (item.Name.Equals("$FILE"))
                        {
                            object[] values = (object[])item.Values;
                            //doc.GetAttachment(values[0].ToString()).ExtractFile(fileSavePath + values[0].ToString());
                        }
                    }
                }



            }

【问题讨论】:

  • 这很简单,不是吗?看起来doc.Items 没有返回NoteItems。这是预期的,你能找到NotesDocument.Item 的文档吗?如果不是这样,那么您截断的其余错误是什么:“由于 fo...而失败”?
  • 20 多年前我曾经做过 Notes API 编程。我不熟悉当前的 C# API,但您收到该消息的原因是因为 itemsA 数组中的对象没有实现 NotesItem 接口。坦率地说,我不知道他们是什么类型的。在foreach 行上放置一个断点并检查返回数组中的项目。
  • 实际上 Interop.Domino.dll 是 com 组件,我已经尝试了 regasm.exe 之类的所有方法来使其工作
  • 我认为这不是 COM 注册的问题。正在发生的事情是 itemsA 是 COM IObject 指针的集合(或者可能是 IDispatch,我不确定)但是用 C# 术语将它转换为 NotesItem 需要从实现 NotesItem 方法的 COM 对象。它通过在对象上调用QueryInterface 来做到这一点,并且由于某种原因,它失败了。也许答案就在您截断的错误消息中:您能给我们剩下的错误消息吗? “由于原因失败”之后的位。
  • E_NOINTERFACE: 是的,所以这不是随机失败,而是您要返回的对象不认为它是NotesItem(或者更确切地说,它没有实现接口GUID,希望表示 INotesItem 或类似名称 - 您可以在注册表中检查)。不幸的是,因为它实际上是隐藏在 COM 代理后面(而且无论如何都不容易在没有调试符号的情况下从 C++ 代码中挖掘出来),所以要弄清楚它实际上是什么会很棘手。

标签: c# lotus-domino


【解决方案1】:

解决了 phewwwwwwww ... Interop.Domino.dll 在我的情况下已损坏,所有面临此问题的人请不要从 Internet 下载 Interop.Domino.dll 而是转到参考->添加参考-->COM-->找到 Lotus Domino Objects 和 Bingo !!!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    相关资源
    最近更新 更多