Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Получить bitmap из буфера обмена и записать его, globallock(handle) -неверный декскриптор 
:(
    Опции темы
Owyn
Дата 12.5.2013, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 11.5.2009

Репутация: нет
Всего: нет



Есть буфер обмена, в нём лежат CF_BITMAP, CF_DIB, CF_DIBV5, надо из него вытащить картинку и засунуть её в массив unsigned char (l_uint8)

Код

if (OpenClipboard(NULL)) // приложение консольное так что нуль
    {
        HANDLE hData;
        if((hData = GetClipboardData(CF_BITMAP)) == NULL) {fprintf(stderr, _("GetClipboardData error.\n"));ShowLastError();}

        HBITMAP hBmp;
        if((hBmp=(HBITMAP)GlobalLock(hData)) == NULL){fprintf(stderr, _("GlobalLock error.\n"));ShowLastError();} // тут выдаёт еррор и он "неверный дискриптор"


        HANDLE hFile = CreateFile("testout.bmp", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0); // тренируемся на кошках, всё равно выше код не работает пока что...
        if (hFile != INVALID_HANDLE_VALUE)
        {
            DWORD bytesWritten;
            WriteFile(hFile, hBmp, GlobalSize(hBmp), &bytesWritten, 0);
            CloseHandle(hFile);
            fprintf(stderr, _("%d bytes written\n"), bytesWritten); // debug
        }
        if(GlobalUnlock(hBmp) == NULL){fprintf(stderr, _("GlobalUnlock error.\n"));ShowLastError();}
        if(CloseClipboard() == NULL){fprintf(stderr, _("CloseClipboard error.\n"));ShowLastError();}
    }


Если подставить CF_DIB то ошибки нет и файл создаётся, но не тот что нужно... Так почему CF_BITMAP не вынимается из буфера?
PM MAIL   Вверх
feodorv
Дата 12.5.2013, 04:04 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(Owyn @  12.5.2013,  03:16 Найти цитируемый пост)
// тут выдаёт еррор и он "неверный дискриптор"

Ну да. GlobalLock может применяться только к объектам, полученными путём GlobalAlloc или GlobalReAlloc. При чём тут GetClipboardData???
Да и зачем здесь GlobalLock/GlobalUnlock? Из Майкрософта:
Код

  if (OpenClipboard(hwnd)) 
  { 
     hbm = (HBITMAP) GetClipboardData(uFormat); 
     SelectObject(hdcMem, hbm); 
     GetClientRect(hwnd, &rc); 
 
     BitBlt(hdc, 0, 0, rc.right, rc.bottom, hdcMem, 0, 0, SRCCOPY); 
     CloseClipboard(); 
  } 

Где здесь GlobalLock/GlobalUnlock?


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Owyn
Дата 12.5.2013, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 11.5.2009

Репутация: нет
Всего: нет



Цитата

Где здесь GlobalLock/GlobalUnlock? 

В примерах из интернета половину которого я перелопатил они были  smile 

Значит чтоб воссоздать битмап надо взять его из (HBITMAP) GetClipboardData(CF_BITMAP); 
потом переписать параметр за параметром его хедер из GlobalLock(GetClipboardData(CF_DIB))?
Потом как-то слить это всё воедино?
Может уже был готовый пример\решение? (лучше если без gdi32.lib)

Код

if (OpenClipboard(hwnd)) 
  { 
     HANDLE hdibptr = GetClipboardData(CF_DIB);
     HANDLE hdib = GlobalLock(hdibptr); // image header
     
     HBITMAP hBmp = GetClipboardData(CF_BITMAP); // image data
     // тут надо сделать магию и соединить их в полноценный bmp файл
     GlobakUnlock(hdibptr); 
     CloseClipboard(); 
  } 


Это сообщение отредактировал(а) Owyn - 12.5.2013, 12:56
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0479 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.