Re: Сохранение битмапа - еще короче !!!
От: Alex Fedotov США  
Дата: 29.11.01 19:27
Оценка: +1
Здравствуйте 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>}
-- Alex Fedotov
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.