如何从TYPE_MIME_PART项目中读取数据?

时间:2018-10-02 11:20:09

标签: lotus-domino c-api

这有点奏效,但问题是似乎MIME_PART结构未初始化?它的所有属性都具有相同的值,即使我尝试打开其他mime项目也是如此。

MIME_PART *pMime;
DHANDLE hPart; 
char *pText;
WORD textLen;
if (error = NSFMimePartGetPart(bidLinksItem, &hPart)) {
 goto exit;
}

pMime = OSLock(MIME_PART, hPart);
textLen = (pMime->wByteCount) - pMime->wHeadersLen - pMime->wBoundaryLen;
pText = (char *)pMime + sizeof(MIME_PART) + wHeadersLen;
char *itemText = (char *)malloc(textLen);       
memcpy(itemText, pText, textLen); 
itemText[textLen] = '\0';
OSUnlock(hPart);

itemText字符串具有大部分内容,但是由于未正确设置MIME_PART结构,因此指向文本的指针已关闭...

那我该如何正确设置MIME_PART?

2 个答案:

答案 0 :(得分:1)

您的代码应该执行以下操作:

DHANDLE hPart; 
char *pchPart;
if (error = NSFMimePartGetPart(bidLinksItem, &hPart)) {
  goto exit;
}

pchPart = OSLock(char, hPart);

换句话说,将句柄锁定为char类型,而不是MIME_PART类型。此时,pchPart指向原始零件数据的开头-从边界(如果存在)和标题开始。您可以使用NSFMimePartGetInfoByBLOCKID来获取边界和标头的长度。

我意识到这与the documentation相矛盾,但是我已经与一位主题专家确认:文档是错误的。

答案 1 :(得分:0)

答案错误,但注释可能有用。我的其他答案更正确。

这个问题可以改善。例如,当您尝试使用代码读取数据时,可以显示一些示例数据并描述结果。

但是我将尝试根据已有信息进行回答。您这样计算出文本长度:

textLen = (pMime->wByteCount) - pMime->wHeadersLen - pMime->wBoundaryLen;

这对我来说似乎不错,但是您可以这样做:

pText = (char *)pMime + sizeof(MIME_PART) + wHeadersLen;

是否保证wHeadersLen等于pMime->wHeadersLen?另外,您没有考虑边界长度。您不应该这样计算地址吗?

pText = (char *)pMime + sizeof(MIME_PART) + pMime->wHeadersLen + pMime->wBoundaryLen;