我的思路是这样的:先将它保存到内存的一个流中,然后把这段内存以文本串的方式保存下来。
代码大概如下:
CComPtr<IFont> spFont;HRESULT hr;
ULARGE_INTEGER uisize;
ULONG maxsize;
CComPtr<IPersistStream> spPS;
CComPtr<IStream> spStream;hr = spFont->QueryInterface(&spPS);
ASSERT(SUCCEEDED(hr));spPS->GetSizeMax(&uisize);
maxsize = LOLONG(uisize.QuadPart) + 1;HGLOBAL  hGlobal = GlobalAlloc(GHND, maxsize);
ZeroMemory(hGlobal, maxsize);
hr = CreateStreamOnHGlobal(hGlobal, TRUE, &spStream);
ASSERT(SUCCEEDED(hr));hr = spStream->SetSize(uisize);
ASSERT(SUCCEEDED(hr));//这句话执行没有效果,hGlobal指向的内存,除了前四个字节(size)外,全为空
hr = OleSaveToStream(spPStream, spStream);
ASSERT(SUCCEEDED(hr));//以下是把内存打印为字符串的代码,略是不是这个对象没有实现IPersistStream的save方法呢?这个对象的实现在哪个文件中,我找了半天也没找到。

解决方案 »

  1.   

    void main()
    {
    ::CoInitialize(NULL); {
    IFontPtr pFont;
    HRESULT hr = pFont.CreateInstance(__uuidof(StdFont)); IPersistStreamPtr pPS;
    pPS = pFont; IStreamPtr pStream;
    hr = ::CreateStreamOnHGlobal(NULL, TRUE, &pStream);// hr = pPS->Save(pStream, TRUE);
    hr = ::OleSaveToStream(pPS, pStream); LARGE_INTEGER li;
    li.QuadPart = 0;
    ULARGE_INTEGER uli;
    // hr = pStream->Seek(li, STREAM_SEEK_END, &uli);
    // DWORD dwSize = uli.LowPart;

    hr = pStream->Seek(li, STREAM_SEEK_SET, &uli); HANDLE hFile = ::CreateFile(_T("C:\\FontStreamFile.fsf"), GENERIC_WRITE, 0, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
    //...
    } BYTE Buffer[4096];
    ULONG cbRead = 0;
    do
    {
    hr = pStream->Read(Buffer, 4096, &cbRead);
    if (cbRead ==0)
    break;
    DWORD dw;
    if (!::WriteFile(hFile, Buffer, cbRead, &dw, NULL))
    {
    //...
    }
    } while (cbRead > 0); ::CloseHandle(hFile);
    } ::CoUninitialize();
    }===========================================