通过C#代码从Lotus Notes(.nsf)文件提取附件时发生异常
当我在foreach循环中将itemA对象强制转换为Notesitem时,下面出现异常,请有人帮助我 无法将“System.\u ComObject”类型的COM对象强制转换为接口类型“Domino.NotesItem”。此操作失败,因为对具有IID“{2913158A-2EED-1069-BF5D-00DD011186B7}”的接口的COM组件的QueryInterface调用失败,原因是以下错误:不支持此类接口(HRESULT中的异常:0x80004002(E_NOINTERFACE))。在WindowsApplication2.Form1.btn搜索\u单击C:\WindowsApplication2\WindowsApplication2\Form1.cs中的(对象发送者,事件参数e):第319行} 我正在使用Interop.Domino.dll和代码:通过C#代码从Lotus Notes(.nsf)文件提取附件时发生异常,c#,lotus-domino,C#,Lotus Domino,当我在foreach循环中将itemA对象强制转换为Notesitem时,下面出现异常,请有人帮助我 无法将“System.\u ComObject”类型的COM对象强制转换为接口类型“Domino.NotesItem”。此操作失败,因为对具有IID“{2913158A-2EED-1069-BF5D-00DD011186B7}”的接口的COM组件的QueryInterface调用失败,原因是以下错误:不支持此类接口(HRESULT中的异常:0x80004002(E_NOINTERFACE))。在
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());
}
}
}
}
NotesSession session=newnotessession();
会话初始化(“XXXXXX”);
尝试
{
NotesDatabase NotesDb=session.GetDatabase(“,”C:\LotusFiles\\XYZ.nsf),false);
if(NotesDb==null)
{
//System.Console.WriteLine(“无法连接到服务器”);
}
其他的
{
//系统控制台写入线(“已连接”);
}
Domino.NotesDocumentCollection col=NotesDb.AllDocuments;
对于(int i=0;i
问题解决了……Interop.Domino.dll在我的案例中已损坏,所有面临此问题的人请不要从internet下载Interop.Domino.dll,而是转到reference-->Add reference-->COM-->查找Lotus Domino对象和宾果!!!这相当简单,不是吗?看起来像doc.Items
is没有返回NoteItem
s。这是预期的吗?您能找到NotesDocument.Item
的文档吗?如果不是,您截断的错误的其余部分是什么:“由于以下原因失败…”?20多年前,我曾做过Notes API编程。我不熟悉当前的C#API,但你之所以会收到这条消息,是因为itemsA
数组中的对象没有实现NotesItem
接口。坦白说,我不知道它们是什么类型。在foreach
行上放置一个断点,然后检查返回数组中的项。实际上Interop.Domino.dll是com组件,我已经尝试了regasm.exe之类的方法来确保它正常工作。我不认为这是com注册的问题。发生的情况是,itemsA
是comIOObject
指针的集合(或者,IDispatch
,我不确定)但要用C语言将其转换为NotesItem
,它需要从实现NotesItem方法的COM对象中获得一个不同的接口。它通过调用对象上的QueryInterface
来实现这一点,由于某种原因,这是失败的。也许答案是您截断的错误消息中的一位:您能给我们错误消息的其余部分,请?“由于fo而失败…”后的位。E_NOINTERFACE
:对,所以这不是随机失败,是因为您要返回的对象不认为它是NotesItem
(或者更确切地说,它没有实现与GUID的接口,这意味着它是指IOTESITY或类似的,您可以在注册表中检查)。不幸的是,由于它实际上是隐藏在COM代理后面的(而且不容易从C++代码中挖掘出,而不需要调试符号)。