这有点奏效,但问题是似乎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?
答案 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;