Привет !
Встретил топик похожий, налабал решение попроще. Так можно сохранять хучь битмапы, хучь иконки, хучь метафайлы и вообще все объекты, поддерживающие IPicture. Написал на Cи — так круче.
BOOL SaveBitmap(HBITMAP hBitmap,HPALETTE hPal,LPCTSTR szPath)
{
PICTDESC pDesc;
pDesc.cbSizeofstruct = sizeof(PICTDESC);
pDesc.bmp.hbitmap = hBitmap;
pDesc.bmp.hpal = hPal;
pDesc.picType = PICTYPE_BITMAP;
return SavePictureIndirect(pDesc,szPath);
}
BOOL SavePictureIndirect(PICTDESC pDesc,LPCTSTR szPath)
{
IPicture* pPicture = NULL;
BOOL bResult = TRUE;
OleCreatePictureIndirect(&pDesc,&IID_IPicture,FALSE,(void**)&pPicture);
if(pPicture == NULL)
bResult = FALSE;
else
{
pPicture->lpVtbl->AddRef(pPicture);
bResult = SavePicture(pPicture,szPath);
}
if(pPicture != NULL)
pPicture->lpVtbl->Release(pPicture);
return bResult;
}
BOOL SavePicture(IPicture* pPicture,LPCTSTR szPath)
{
IStream* pStream = NULL;
HGLOBAL hgl = NULL;
void* lpVoid = NULL;
long nSize = 0;
HRESULT hr = S_OK;
HANDLE handle = NULL;
LONG res = 0;
DWORD err = 0;
if(pPicture == NULL)
return FALSE;
do
{
hgl = GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD,8192);
if(hgl == NULL)
break;
CreateStreamOnHGlobal(hgl,FALSE,&pStream);
if(pStream == NULL)
break;
pPicture->lpVtbl->put_KeepOriginalFormat(pPicture,TRUE);
hr = pPicture->lpVtbl->SaveAsFile(pPicture,pStream,TRUE,&nSize);
if(FAILED(hr))
break;
handle = CreateFile(szPath,
GENERIC_WRITE,
FILE_SHARE_WRITE,NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
lpVoid = GlobalLock(hgl);
WriteFile(handle,lpVoid,nSize,&res,NULL);
}
while(FALSE);
if(pPicture != NULL)
pPicture->lpVtbl->Release(pPicture);
if(pStream != NULL)
pStream->lpVtbl->Release(pStream);
if(hgl != NULL)
{
if(lpVoid != NULL)
GlobalUnlock(hgl);
GlobalFree(hgl);
}
if(handle != NULL)
CloseHandle(handle);
return (res != 0) && (res == nSize);
}