2

我需要将字体与我的数据一起存储,以确保我的文档在所有机器上都相同。为此,我使用 TTEmbedFont 来抓取字节并将它们保存出来,然后在将字体加载到内存后使用 TTLoadEmbeddedFont 来安装字体。

问题是每当我尝试使用 TTLoadEmbeddedFont 时,我都会收到 E_FONTDATAINVALID。它调用我的 READEMBEDPROC 三次,每次请求 4 个字节,然后返回错误。我的读取过程如下所示:

unsigned long CFontLoaderDlg::ReadFontCallback(
_In_  void *lpvReadStream,
_In_  void *lpvBuffer,
_In_  const unsigned long cbBuffer
)
{
    CFontLoaderDlg *loader = static_cast<CFontLoaderDlg *>(lpvReadStream);
    size_t remaining = loader->m_font_bytes.size() - loader->m_pos;
    size_t bytes_to_read = (cbBuffer > remaining) ? remaining : cbBuffer;
    memcpy(lpvBuffer, &(loader->m_font_bytes[loader->m_pos]), bytes_to_read);
    loader->m_pos += bytes_to_read;
    return bytes_to_read;
}

向量 m_font_bytes 保存了我调用 TTEmbedFont 时写的再见。

我对 TTLoadFont 的调用如下所示:

        LONG ret =  TTLoadEmbeddedFont(
        &hFontReference,
        TTLOAD_PRIVATE,
        &ulPrivStatus,
        LICENSE_PREVIEWPRINT,
        &ulStatus,
        ReadFontCallback,
        this,
        nullptr,
        nullptr,
        nullptr
        );

有没有人遇到过类似的问题,或者让这些东西正常工作?

4

0 回答 0