Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 28 мар 2024, 18:13

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: Буфер обмена
СообщениеДобавлено: 25 мар 2020, 12:39 
Не в сети

Сообщения: 116
Откуда: Каменск-Уральский
Меня интересует как работать с глобальным блоком памяти (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;


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Буфер обмена
СообщениеДобавлено: 27 мар 2020, 13:39 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Как-то так:
Код: "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;



Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Буфер обмена
СообщениеДобавлено: 28 мар 2020, 14:48 
Не в сети

Сообщения: 116
Откуда: Каменск-Уральский
Zorko писал(а):
(* Работаем с выделенным блоком *)

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


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Буфер обмена
СообщениеДобавлено: 28 мар 2020, 18:12 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
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


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Буфер обмена
СообщениеДобавлено: 04 апр 2020, 16:30 
Не в сети
Администратор
Аватара пользователя

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


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club