Несколько замечаний к приведённому коду:
1. Не знаю, как в других компиляторах, а в VC 2003 атрибута lpVtbl нет.
2. Такой функции как ltrlenA я не нашёл.
В итоге, код, котовый к вставке в программу (проверено на VC 2003, он же 7.1):
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 bResult = SavePicture(pPicture,szPath);
if(pPicture != NULL) pPicture->Release();
return bResult;
}
BOOL SavePicture(IPicture* pPicture,LPCTSTR szPath)
{ HRESULT hr; int size = strlen(szPath);
#ifdef _UNICODE
BSTR bstrPath = SysAllocString(szPath);
if (bstrPath == NULL) return FALSE;
#else
int len = strlen(szPath);
BSTR bstrPath = SysAllocStringLen(NULL, len);
if (bstrPath == NULL) return FALSE;
MultiByteToWideChar(CP_ACP, 0, szPath, -1, bstrPath, len + 1);
#endif
hr = OleSavePictureFile((LPDISPATCH)pPicture,bstrPath);
SysFreeString(bstrPath);
return SUCCEEDED(hr);
}
Можно вызвать SaveBitmap, положив hPal=NULL, в этом случае будет использована палитра экрана.