【发布时间】: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是 COMIObject指针的集合(或者可能是IDispatch,我不确定)但是用 C# 术语将它转换为NotesItem需要从实现 NotesItem 方法的 COM 对象。它通过在对象上调用QueryInterface来做到这一点,并且由于某种原因,它失败了。也许答案就在您截断的错误消息中:您能给我们剩下的错误消息吗? “由于原因失败”之后的位。 -
E_NOINTERFACE: 是的,所以这不是随机失败,而是您要返回的对象不认为它是NotesItem(或者更确切地说,它没有实现接口GUID,希望表示 INotesItem 或类似名称 - 您可以在注册表中检查)。不幸的是,因为它实际上是隐藏在 COM 代理后面(而且无论如何都不容易在没有调试符号的情况下从 C++ 代码中挖掘出来),所以要弄清楚它实际上是什么会很棘手。
标签: c# lotus-domino