Оберон-клуб «ВЄДАsoft»
https://zx.oberon.org/forum/

Буфер обмена
https://zx.oberon.org/forum/viewtopic.php?f=79&t=486
Страница 1 из 1

Автор:  Len [ 25 мар 2020, 12:39 ]
Заголовок сообщения:  Буфер обмена

Меня интересует как работать с глобальным блоком памяти (GlobalAlloc), использующемся при работе с буфером обмена.
Код: "OBERON"
  1. PROCEDURE Start*;
  2. VAR
  3. i : WinApi.BOOL;
  4. str: ARRAY 100 OF CHAR;
  5. contentClipboard: INTEGER;
  6. BEGIN
  7. i := WinApi.OpenClipboard (0);
  8. contentClipboard := WinApi.GetClipboardData (WinApi.CF_TEXT);
  9. str := WinApi.GlobalLock (contentClipboard);
  10.  
  11. StdLog.String (str);
  12. i := WinApi.GlobalUnlock (contentClipboard);
  13. i := WinApi.CloseClipboard ()
  14. END Start;

Автор:  Zorko [ 27 мар 2020, 13:39 ]
Заголовок сообщения:  Re: Буфер обмена

Как-то так:
Код: "OBERON"
  1. IMPORT w := WinApi, Log;
  2.  
  3. VAR
  4. membuf: w.HGLOBAL; (* Это не адрес памяти, а хэндл - её идентификатор *)
  5. adr: w.PtrVoid; (* А вот это уже будет адрес блока памяти *)
  6. BEGIN
  7. membuf := w.GlobalAlloc(w.GMEM_FIXED + w.GMEM_ZEROINIT, 2048);
  8. IF membuf = w.NULL THEN (* По какой-то причине память выделить не удалось *)
  9. END;
  10.  
  11. (* Идентификатор, полученный от функции GlobalAlloc, нельзя использовать
  12.   для адресации памяти непосредственно. Напомним, что пока вы
  13.   не зафиксировали блок памяти, его логический адрес недоступен. *)
  14.  
  15. (* Для получения доступа к полученному блоку памяти его необходимо
  16.   зафиксировать, вызвав функцию GlobalLock *)
  17.  
  18. adr := w.GlobalLock(membuf);
  19. IF adr = w.NULL THEN (* По какой-то причине не удалось зафиксировать блок *)
  20. END;
  21.  
  22. (* Работаем с выделенным блоком *)
  23. Log.String("GlobalAlloc allocated "); Log.Int(w.GlobalSize(membuf); Log.String(" bytes");
  24.  
  25. ...
  26.  
  27. IF w.GlobalUnlock(membuf) THEN END; (* Разблокируем блок памяти. Игнорируем результат *)
  28.  
  29. membuf := w.GlobalFree(membuf); (* Освобождаем выделенную память *)
  30. IF membuf # w.NULL THEN (* По какой-то причине не удалось освободить память *)
  31. END;


Автор:  Len [ 28 мар 2020, 14:48 ]
Заголовок сообщения:  Re: Буфер обмена

Zorko писал(а):
(* Работаем с выделенным блоком *)

Вот это то и непонятно: как работать с зафиксированным блоком памяти, как извлечь из него, например, текст?

Автор:  Zorko [ 28 мар 2020, 18:12 ]
Заголовок сообщения:  Re: Буфер обмена

Len писал(а):
как работать с зафиксированным блоком памяти, как извлечь из него, например, текст?
После успешного вызова w.GlobalLock работаем с адресуемым по ненулевому adr куском памяти, зная его размер (и не выходя за его пределы):
Код: "OBERON"
  1. IMPORT SYSTEM;
  2.  
  3. ...
  4.  
  5. VAR ch: SHORTCHAR;
  6. BEGIN
  7. SYSTEM.GET(adr, ch); (* Получили первый байт (символ) из памяти *)
  8. ...
  9. SYSTEM.GET(adr+1, ch); (* Получили второй байт (символ) из памяти *)
  10. ...
  11. SYSTEM.PUT(adr+9, 20X); (* Записали код пробела " " в десятый байт памяти *)
  12. END

После того как поработали с этим куском, вызываем w.GlobalUnlock

Автор:  ivan_denisov [ 04 апр 2020, 16:30 ]
Заголовок сообщения:  Re: Буфер обмена

Опубликовал пример на OberonCore, не сразу заметил обсуждение тут.
https://forum.oberoncore.ru/viewtopic.php?f=29&t=6591&p=111498#p111497

Страница 1 из 1 Часовой пояс: UTC + 2 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/