Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];

Вниз

GetClipboardData(CF_BITMAP) и GlobalLock   Найти похожие ветки 

 
Джо ©   (2006-10-16 17:19) [0]

Прототип кода:

procedure TForm24.Button1Click(Sender: TObject);
var
 H: Cardinal;
 P: Pointer;
begin
 OpenClipboard(Handle);
 try
   if IsClipboardFormatAvailable(CF_BITMAP) then
   begin
     H := GetClipboardData(CF_BITMAP);
     if H = 0 then
       RaiseLastOSError;
     P := GlobalLock(H);
     if P = nil then //
       RaiseLastOSError; // The Handle is invalid
     GlobalUnlock(H);
   end
 finally
   CloseClipboard();
 end;
end;

Перед выполнением кода делаем PrintScreen, получаем соответствующий Exception в выделенном комментариями месте.

Что я упустил и где сел в лужу?


 
clickmaker ©   (2006-10-16 17:32) [1]

попробуй CF_DIB


 
guav ©   (2006-10-16 17:35) [2]

Почему бы не исследовать, как это делается в этом коде:
procedure TForm1.Button2Click(Sender: TObject);
begin
 Image1.Picture.Bitmap.Assign(Clipboard);
end;


Там вместо GlobalLock идёт GetObject, т.е. вместо хендла памяти хендл битмапа.


 
Джо ©   (2006-10-16 17:46) [3]

> [1] clickmaker ©   (16.10.06 17:32)
> попробуй CF_DIB

Нет, нужен именно CF_BITMAP.


> Там вместо GlobalLock идёт GetObject, т.е. вместо хендла
> памяти хендл битмапа.

Чего же он, подлец, не хочет память фиксировать с GlobalLock? вот что непонятно... И мне нужно именно GlobalLock, дабы получить указатель на область памяти.


 
guav ©   (2006-10-16 17:54) [4]

> Чего же он, подлец, не хочет память фиксировать с GlobalLock?

По-твоему, это должно работать:
procedure TForm1.Button3Click(Sender: TObject);
var
  P: Pointer;
begin
  P := GlobalLock(Image1.Picture.Bitmap.Handle);
  if P = nil then //
    RaiseLastOSError; // The Handle is invalid
end;

?

Тут вроде как написано что CF_BITMAP содержит " handle to a bitmap " (а CF_DIB - " A memory object containing a BITMAPINFO structure followed by the bitmap bits. "  ) http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/dataexchange/clipboard/clipboardformats.asp


 
Джо ©   (2006-10-16 17:58) [5]

> [4] guav ©   (16.10.06 17:54)
>
> По-твоему, это должно работать:

Отчего же тогда работает с CF_TEXT или CF_DIB?


 
clickmaker ©   (2006-10-16 18:00) [6]


> [5] Джо ©   (16.10.06 17:58)

да, кстати, когда CF_BITMAP, GlobalLock не нужно
Т.е. можно так
Bmp := TBitmap.Create;
Bmp.Handle := GetClipboardData(CF_BITMAP);


 
Джо ©   (2006-10-16 18:02) [7]

> [6] clickmaker ©   (16.10.06 18:00)
>
> > [5] Джо ©   (16.10.06 17:58)
>
> да, кстати, когда CF_BITMAP, GlobalLock не нужно
> Т.е. можно так
> Bmp := TBitmap.Create;
> Bmp.Handle := GetClipboardData(CF_BITMAP);

Да как же без GlobalLock? Мне ведь нужно зафиксировать этот GlobalMemoryObject на время, пока я буду копировать данные в свой буфер из клипборда. Иначе, что станется, если в процессе копирования данных, данные в клипборде изменятся?


 
clickmaker ©   (2006-10-16 18:08) [8]


> [7] Джо ©   (16.10.06 18:02)

не парься :)


 
Джо ©   (2006-10-16 18:08) [9]

Объясню задачу чуть более развернуто.

Регистрируется свой ClipboardViewer.
В момент, когда данные в клипборде изменяются нужно делать следующее:
1. Определяем все доступные в клипборде форматы.
2. Для каждого формата получается указатель на глобальную область памяти,  где они хранятся.
3. Данные для каждого формата копируются в свой буфер.

Для этого и нужен GlobalLock/GlobalUnlick. Не пойму, в чем "затык" с CF_BITMAP.


 
guav ©   (2006-10-16 18:09) [10]

> Отчего же тогда работает с CF_TEXT или CF_DIB?

Наверное от того, что там хендл не на память, а GDI шный хендл. видимо, может быть и такое.
Кстати, по ссылке [4] написано, что CF_DIB создаётся автоматически из CF_BITMAP.


 
clickmaker ©   (2006-10-16 18:09) [11]


> в чем "затык" с CF_BITMAP

в том, что собственно данных там нет, а есть указатель на данные - HBITMAP. А в случае с CF_DIB - есть.


 
Джо ©   (2006-10-16 18:11) [12]

> [10] guav ©   (16.10.06 18:09)
> > Отчего же тогда работает с CF_TEXT или CF_DIB?
>
> Наверное от того, что там хендл не на память, а GDI шный
> хендл. видимо, может быть и такое.

Кажется, немного стал "вьезжать" в суть. :) Эх, хотелось унифицированно как-то подойти... Спасибо за помощь.


 
Джо ©   (2006-10-16 18:12) [13]

> [11] clickmaker ©   (16.10.06 18:09)
>
> > в чем "затык" с CF_BITMAP
>
> в том, что собственно данных там нет, а есть указатель на
> данные - HBITMAP.

Да, теперь понял. Спасибо за помощь.
Внимательнее нужно мне было MSDN читать :)



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2007.02.25;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.04 c
2-1171009254
head-dron
2007-02-09 11:20
2007.02.25
Открытие документа через мою программу.


15-1170209414
RustamK
2007-01-31 05:10
2007.02.25
Найти наименьшую цепочку...


15-1170588148
SkySpeed
2007-02-04 14:22
2007.02.25
Можно ли исп-вать флэшку в качестве доп. опер. памяти в WinXP?


15-1170408815
pasha_golub
2007-02-02 12:33
2007.02.25
PPP & Multilink


3-1164877480
tytus
2006-11-30 12:04
2007.02.25
Как отсортировать данные в OracleDataSet?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский