Здравствуйте Hollander, Вы писали:
H>Привет !
H>Откопал случайно в заголовочном файле функцию. В MSDN у меня недокументировано ничего — апрельский этого года. А заголовочный файл от 4.24.98 !!!
H>Эта функция может, по идее, сохранять все то, что загружает OleLoadPicture — BMP, GIF, JPEG, ICO, WMF, и EMF
H>WINOLECTLAPI OleSavePictureFile(LPDISPATCH lpdispPicture,
H> BSTR bstrFileName);
H>итак :
И опять есть к чему придраться.
H>BOOL SaveBitmap(HBITMAP hBitmap,HPALETTE hPal,LPCTSTR szPath)
H>{
H> PICTDESC pDesc;
H>
H> pDesc.cbSizeofstruct = sizeof(PICTDESC);
H> pDesc.bmp.hbitmap = hBitmap;
H> pDesc.bmp.hpal = hPal;
H> pDesc.picType = PICTYPE_BITMAP;
H> return SavePictureIndirect(pDesc,szPath);
H>}
H>BOOL SavePictureIndirect(PICTDESC pDesc,LPCTSTR szPath)
H>{
H> IPicture* pPicture = NULL;
H> BOOL bResult = TRUE;
H> OleCreatePictureIndirect(&pDesc,&IID_IPicture,FALSE,(void**)&pPicture);
H> if(pPicture == NULL)
H> bResult = FALSE;
H> else
H> bResult = SavePicture(pPicture,szPath);
// Возможно, это дело вкуса, но я не понимаю, зачем еще раз проверять
// pPicture на NULL, когда мы только что это сделали. Впрочем, оптимизатор
// должен разобраться и сделать как надо.
H> if(pPicture != NULL)
H> pPicture->lpVtbl->Release(pPicture);
H> return bResult;
H>}
H>BOOL SavePicture(IPicture* pPicture,LPCTSTR szPath)
H>{
H> HRESULT hr;
// Вот здесь начинается что-то странное. На вход дается строка LPCTSTR,
// ее длина определяется с помощью strlen, что не будет компилироваться
// в Unicode. Кроме того, вызов MultiByteToWideChar нужен только в
// Unicode-компиляции, а вместо SysAllocStringByteLen стоит использоват
// SysAllocStringLen.
//
// Проверку на успешность выделения памяти тоже не мешает добавить.
H> int size = strlen(szPath);
H> BSTR bstrPath = SysAllocStringByteLen(szPath,size*2);
// Последний параметр для MultiByteToWideChar указан неправильно. Это
// количество символов, так что умножать на два не надо.
H> MultiByteToWideChar(CP_ACP,0,szPath,size, bstrPath, size*2);
// В итоге получается
#ifdef _UNICODE
BSTR bstrPath = SysAllocString(szPath);
if (bstrPath == NULL)
return FALSE;
#else
int len = ltrlenA(szPath);
BSTR bstrPath = SysAllocStringLen(NULL, len);
if (bstrPath == NULL)
return FALSE;
MultiByteToWideChar(CP_ACP, 0, szPath, -1, bstrPath, len + 1);
#endif
H> hr = OleSavePictureFile((LPDISPATCH)pPicture,bstrPath);
H> SysFreeString(bstrPath);
H> return SUCCEEDED(hr);
H>}