我的思路是这样的:先将它保存到内存的一个流中,然后把这段内存以文本串的方式保存下来。
代码大概如下:
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方法呢?这个对象的实现在哪个文件中,我找了半天也没找到。
代码大概如下:
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方法呢?这个对象的实现在哪个文件中,我找了半天也没找到。
{
::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();
}===========================================