【问题标题】:How do I read the data from a TYPE_MIME_PART item?如何从 TYPE_MIME_PART 项目中读取数据?
【发布时间】:2018-10-02 11:20:08
【问题描述】:

它有点工作,但问题是 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?

【问题讨论】:

    标签: lotus-domino c-api


    【解决方案1】:

    您的代码应该改为:

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

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

    我意识到这与 the documentation 相矛盾,但我已与主题专家确认:文档有误。

    【讨论】:

    • 非常感谢戴夫!我现在可以从 mime 部分获取我需要的数据。
    【解决方案2】:

    错误的答案,但 cmets 可能有用。我的另一个答案更正确。

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

    但我会尽量根据我掌握的信息来回答。您这样计算文本长度:

    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;
    

    【讨论】:

    • wHeadersLen 应该是 pMime->wHeadersLen。问题是 pMime-wHeadersLen 始终是该值是 8250,MIME_PART 结构似乎没有设置正确的值
    • 我不是这方面的专家,但我查看了一些使用NSFMimePartGetPart 的其他代码。该代码使用OSLock(char, hPart) 锁定零件手柄。换句话说,它不期望NSFMimePartGetPart 将句柄返回给MIME_PART。它需要部件数据本身的句柄(从边界和标题开始)。您将使用NSFMimePartGetInfoByBLOCKID 来获取边界和标题的长度。我意识到这不是 NSFMimePartGetPart 的记录方式。可以看看OSLock返回的内存吗?只是部分数据吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-11
    • 2020-11-01
    • 2017-09-20
    • 2011-04-22
    • 2021-04-02
    • 2016-02-20
    相关资源
    最近更新 更多