0

我参与使用 C API 与 Lotus Notes 和 Lotus Domino 交互。从 NSF 中读取现有注释时,我遇到了问题。具体来说,读取 TYPE_OBJECT 字段,更具体地说,读取 $FILE 字段(尽管我确信如果我有其他字段,所有 TYPE_OBJECT 字段都会失败)。

我正在使用 NSFItemInfo 获取 $FILE 字段上的摘要数据(所以我不需要保存的文件,我需要有关它的信息,例如它的大小、名称等......)。

如果我在内存中创建注释,提交它,然后读取 $FILE 字段,一切正常。如果我更改单元测试以读取现有注释(而不是在内存中创建它),Lotus PANICS 会出现 Invalid Handle Lookup 消息。

因此,当我从头开始创建笔记与打开已经创建的笔记时,我感觉加载这些字段有些不同。即使阅读已经创建的注释,我自己创建的代码也会给我同样的错误,所以我认为我正确地创建了注释。

我已经探索了 NSFNoteOpenExt 的标志选项,并尝试使用 OPEN_xxx 中描述的每个可能的标志打开 Note,但我总是会出现恐慌,除非我使用 OPEN_ABSTRACT 或 OPEN_NOOBJECTS 打开 Note。不过,那些没有出错的原因是因为他们打开 Note 时根本没有 $FILE 字段,所以当我看到该字段是否存在时,我得到一个 false 并且在 TYPE_OBJECT 字段中读取的代码永远不会执行。

有什么我想念的想法吗?

我会提供代码,但我实际上是使用 .NET 互操作来完成所有这些,并且代码分布在多个文件等中......如果您有任何问题,请提出,我会提供尽可能多的详细信息我可以。

  • 克雷格
4

1 回答 1

0

我弄清楚了这个问题。这是因为在 C# 中使用互操作时,不能调用 C 宏。 OSLockBlock被定义为一个宏到另一个宏到一个函数。本质上,它锁定BlockId.Pool指针,然后将指针递增BlockId.BlockHandle. 我错误地将宏逻辑解释为首先递增BlockId.PoolBlockId.BlockHandle然后锁定。

本质上:

Lock(BlockId.Pool)+BlockId.BlockHandle Vs Lock(BlockId.Pool+BlockId.BlockHandle)

有趣的是,后者在创建带有新附件的新笔记时会起作用。我终于也弄清楚了,BlockId.BlockHandle这样做时总是为零。所以这就是为什么它总是有效的。

于 2012-08-24T18:03:54.253 回答