OberonCore

Библиотека  Wiki  Форум  BlackBox  Компоненты  Проекты
Текущее время: Вторник, 16 Апрель, 2024 15:12

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




Начать новую тему Ответить на тему  [ Сообщений: 17 ] 
Автор Сообщение
 Заголовок сообщения: Работа с untagged-типами
СообщениеДобавлено: Понедельник, 28 Ноябрь, 2005 13:21 
Аватара пользователя

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 13:17
Сообщения: 84
Откуда: Россия, Мурманск
Неплохо было бы дополнить документацию.
Например, нигде не нашёл описания модуля COM, также отсутствуют сведения по квадратным скобкам. В следующем контексте:
TYPE LaLa=RECORD [здесь может быть строка, или слово untagged, а может и ещё что нибудь] и далее как обычно. Также они встречаются в описаниях массивов и формальных параметров. Что означают - непонятно. Может, есть ещё какие-то нераскрытые темы.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 28 Ноябрь, 2005 13:32 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Не существует такого модуля COM. Это псевдомодуль, compiler-magic, так же, как и SYSTEM. Дает возможность описывать интерфейсы COM, например, указывая GUID в квадратных скобках, как в Дельфе...

Про SYSTEM и квадратные скобки можно прочесть в Platform-Specific-Issues (Особенности платформы). Про COM - частично там же. Если же использовать расширенные возможности Direct-To-Com Compiler (в первую очередь полезны для серверов COM) - то это подсистема COM и ее документация, пока что не переведенная.

А еще есть подсистема Ctl, содержащая интерфейсы автоматизации к MS Office и кое-какую документацию. На нашем сайте мы ее из дистрибутива вырезали, т.к. она весит добрую половину пакета. Если требуется, закачайте полный ББ на oberon.ch.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 28 Ноябрь, 2005 15:56 
Аватара пользователя

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 13:17
Сообщения: 84
Откуда: Россия, Мурманск
Илья Ермаков писал(а):
Не существует такого модуля COM. Это псевдомодуль, compiler-magic, так же, как и SYSTEM. Дает возможность описывать интерфейсы COM, например, указывая GUID в квадратных скобках, как в Дельфе

Вот именно описание псевдомодуля COM больше всего и интересует...
Пытаюсь подключаться к OLE-серверам, используя disp-интерфейс. В документации к OLE-серверам имеются только имена свойств иметодов. Вот, например что за функция COM.ID(???) - я её даже использую, но не знаю что она делает. С untagged массивами жуткая проблема. Чтобы вызвать метод WinOleAut.IDispatch.Invoke, необходимо заполнить структуру
Код:
DISPPARAMS* = RECORD [untagged]
   rgvarg*: POINTER TO ARRAY [untagged] OF VARIANTARG;
   rgdispidNamedArgs*: POINTER TO ARRAY [untagged] OF DISPID;
   cArgs*: INTEGER;
   cNamedArgs*: INTEGER;
END;

Но как распределить память под POINTER TO ARRAY [untagged] OF VARIANTARG - я не понимаю. Процедура NEW - не работает. А что делать???


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 28 Ноябрь, 2005 18:41 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
Пока с этим не работал. Вообще-то, такие типы выделять можно системными вызовами WinApi.VirtualAlloc или HeapAlloc, как это под Win32 и принято. Может быть, есть где-то функция-оболочка под них.

А вообще, Oberon Micrsosystems рекомендует использовать подсистему Com и Direct-To-Com Compiler. Просто до версии 1.5 он не входил в поставку, а продавался отдельно, и приходилось использовать записи с процедурными полями.

А подсистема Ctl у Вас есть?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 28 Ноябрь, 2005 19:01 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
sacred писал(а):
Но как распределить память под POINTER TO ARRAY [untagged] OF VARIANTARG - я не понимаю. Процедура NEW - не работает. А что делать???


Распределите память под обычный массив нужной длины.
Адрес нулевого элемента присвойте своему untagged-указателю.
В таком духе.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 28 Ноябрь, 2005 19:24 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 18:55
Сообщения: 2272
Откуда: Россия, Нижний Новгород
sacred писал(а):
Но как распределить память под POINTER TO ARRAY [untagged] OF VARIANTARG - я не понимаю. Процедура NEW - не работает. А что делать???


Тоже самое на другом форуме
http://progz.ru/forum/viewtopic.php?t=20135


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 28 Ноябрь, 2005 20:47 
Аватара пользователя

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 13:17
Сообщения: 84
Откуда: Россия, Мурманск
info21 писал(а):
Адрес нулевого элемента присвойте своему untagged-указателю.
В таком духе.

А пример можно? Как там будет с совместимостью по присваиванию? И как получить адрес нулевого элемента? Насколько я знаю, функции получения адреса в BlackBox возвращают INTEGER, а не POINTER.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 28 Ноябрь, 2005 22:08 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
В таких "низкоуровневых" случаях в ББ действительно есть compiler-magic - нетипизированное преобразование SYSTEM.VAL(T - имя типа, к которому приводим, x - значение любого другого типа).

Там же в "Особенности платформы" эти вещи описаны. Правильно сказал Trurl на progs.ru - что [untagged] - это чужая память. Распределяется обычно системой. Например, менеджером кучи Windows.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 28 Ноябрь, 2005 22:12 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
info21 писал(а):
Распределите память под обычный массив нужной длины.
Адрес нулевого элемента присвойте своему untagged-указателю.
В таком духе.


Так делать очень опасно по одной простой причине: если untagged-указатель уйдет "налево" - в другую dll или в системный вызов, то сборщик мусора это не отследит и может прибить объект в самый неподходящий момент. Да даже внутри среды: если все tagged-указатели на память уйдут из области видимости, то память будет освобождена, и untagged-ссылки окажутся висячими!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Понедельник, 28 Ноябрь, 2005 23:40 
Аватара пользователя

Зарегистрирован: Пятница, 25 Ноябрь, 2005 12:02
Сообщения: 8500
Откуда: Троицк, Москва
Илья Ермаков писал(а):
info21 писал(а):
Распределите память под обычный массив нужной длины.
Адрес нулевого элемента присвойте своему untagged-указателю.
В таком духе.


Так делать очень опасно по одной простой причине: если untagged-указатель уйдет "налево" - в другую dll или в системный вызов, то сборщик мусора это не отследит и может прибить объект в самый неподходящий момент.


Привяжите объект глобально.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 29 Ноябрь, 2005 12:08 
Аватара пользователя

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 13:17
Сообщения: 84
Откуда: Россия, Мурманск
info21 писал(а):
Привяжите объект глобально.

Это как? (Извините, что надоедаю....)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 29 Ноябрь, 2005 12:11 
Аватара пользователя

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 13:17
Сообщения: 84
Откуда: Россия, Мурманск
Илья Ермаков писал(а):
Так делать очень опасно по одной простой причине: если untagged-указатель уйдет "налево" - в другую dll или в системный вызов, то сборщик мусора это не отследит и может прибить объект в самый неподходящий момент. Да даже внутри среды: если все tagged-указатели на память уйдут из области видимости, то память будет освобождена, и untagged-ссылки окажутся висячими!

Очень полезное и информативное замечание! Спасибо, я не знал о таких тонкостях.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 29 Ноябрь, 2005 15:24 
Модератор
Аватара пользователя

Зарегистрирован: Понедельник, 14 Ноябрь, 2005 18:39
Сообщения: 9459
Откуда: Россия, Орёл
sacred писал(а):
info21 писал(а):
Привяжите объект глобально.

Это как? (Извините, что надоедаю....)


Держать ссылку на память в глобальной переменной. Этакий "якорь". Тогда память не освободится, пока не будет выгружен модуль. Но зачем? [untagged] - это системные объекты, и память под них лучше выделять системно, помимо менеджера памяти ББ.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 29 Ноябрь, 2005 16:59 
Аватара пользователя

Зарегистрирован: Воскресенье, 27 Ноябрь, 2005 18:46
Сообщения: 27
Откуда: Санкт-Петербург
Еще один вариант объявить
Код:
TYPE
   SomeType = POINTER TO RECORD
      disPar: DISPARAMS
   END;

а его уже размещать в памяти.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 29 Ноябрь, 2005 20:35 
Аватара пользователя

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 13:17
Сообщения: 84
Откуда: Россия, Мурманск
Takun писал(а):
Еще один вариант объявить
Код:
TYPE
   SomeType = POINTER TO RECORD
      disPar: DISPARAMS
   END;

а его уже размещать в памяти.

Уверен, что это не сработает.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 29 Ноябрь, 2005 20:40 
Аватара пользователя

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 13:17
Сообщения: 84
Откуда: Россия, Мурманск
Илья Ермаков писал(а):
В таких "низкоуровневых" случаях в ББ действительно есть compiler-magic - нетипизированное преобразование SYSTEM.VAL(T - имя типа, к которому приводим, x - значение любого другого типа).


спасибо за "наводку", про SYSTEM.VAL - не знал. Однако, это тоже не поможет. Дело в том, что в модуле WinOleAut описание типа выглядит так:
Код:
DISPPARAMS* = RECORD [untagged]
   rgvarg*: POINTER TO ARRAY [untagged] OF VARIANTARG;
.......
То есть поле rgvarg имеет безымянный тип, который несовместим по присваиванию ни с чем....
Уточняю свой первоначальный вопрос: Можно ли заполнить структуру WinOleAut.DISPPARAMS, не исправляя сам модуль WinOleAut?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вторник, 29 Ноябрь, 2005 21:14 
Аватара пользователя

Зарегистрирован: Понедельник, 28 Ноябрь, 2005 13:17
Сообщения: 84
Откуда: Россия, Мурманск
Нашёл, как говорится Эврика!
Код:
VAR
  P:WinApi.PtrVoid;
  Params : WinOleAut.DISPPARAMS;
BEGIN
  P := WinApi.HeapAlloc(WinApi.GetProcessHeap(), {}, SIZE(WinOleAut.VARIANTARG)*n);
  SYSTEM.PUT(SYSTEM.ADR(Params.rgvarg), P);
  Params.cArgs := n;

,где n - число параметров вызываемого метода.

Всем спасибо за участие. Без вашей помощи я бы долго ковырялся.


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

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


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

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


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

Найти:
Вся информация, размещаемая участниками на конференции (тексты сообщений, вложения и пр.) © 2005-2024, участники конференции «OberonCore», если специально не оговорено иное.
Администрация не несет ответственности за мнения, стиль и достоверность высказываний участников, равно как и за безопасность материалов, предоставляемых участниками во вложениях.
Без разрешения участников и ссылки на конференцию «OberonCore» любое воспроизведение и/или копирование высказываний полностью и/или по частям запрещено.
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB