Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Oberon
Перезагрузить страницу Нужно заполнить поле rgvarg как это сделать
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
sacred1972 sacred1972 вне форума
Member
 
Сообщений: 21
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.07.2005
По умолчанию Нужно заполнить поле rgvarg как это сделать - 28.11.2005, 00:35

В модуле WinOleAut есть такое определение
Код:
DISPPARAMS* = RECORD [untagged]
    rgvarg*: POINTER TO ARRAY [untagged] OF VARIANTARG;
    rgdispidNamedArgs*: POINTER TO ARRAY [untagged] OF DISPID;
    cArgs*: INTEGER;
    cNamedArgs*: INTEGER;
END;
Нужно заполнить поле rgvarg. Вопрос как? Процедура NEW - не работает.
Ответить с цитированием
  (#2 (permalink)) Старый
Trurl Trurl вне форума
Member
 
Сообщений: 108
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.08.2004
По умолчанию 28.11.2005, 12:45

Ну, так VariantInit, VariantChangeType, VarUI1FromI4 и далее по списку.
Ответить с цитированием
  (#3 (permalink)) Старый
sacred1972 sacred1972 вне форума
Member
 
Сообщений: 21
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.07.2005
По умолчанию 28.11.2005, 13:09

WinOleAut.VariantInit* (VAR [nil] pvarg: VARIANTARG);

Как видно из описания, функция VariantInit работает с типом VARIANTARG. Однако, вопрос был не в этом. Как работать с типами VARIANTARG и VARIANT несложно догадаться. Сложно догадаться как выделить память под POINTER TO ARRAY [untagged] OF чего-угодно.
Что мне делать с указателем на untagged массив? При объявлении переменной типа WinOleAut.DISPPARAMS поле rgvarg не указывает на какой-либо выделенный участок памяти. Что делать дальше?
Ответить с цитированием
  (#4 (permalink)) Старый
Trurl Trurl вне форума
Member
 
Сообщений: 108
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 26.08.2004
По умолчанию 28.11.2005, 18:45

За этим - в MSDN.

SafeArrayCreate
Creates a new array descriptor, allocates and initializes the data for the array, and returns a pointer to the new array descriptor.

SafeArrayCreateVector
Creates a one-dimensional array whose lower bound is always zero.
и т.д.
В крайнем случае, можно и через HeapAlloc, а потом все ручками заполнить.

Для ББ ARRAY [untagged] OF - это, как правило, "чужая" память, которую он не выделяет и не освобождает.
Ответить с цитированием
  (#5 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию Re: Проблема с указателем на untagged массив - 28.11.2005, 20:25

Параллельное обсуждение того же самого на другом форуме:
http://blackbox.metasystems.ru/forum/viewt...c.php?p=219#219
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
sacred1972 sacred1972 вне форума
Member
 
Сообщений: 21
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.07.2005
По умолчанию 28.11.2005, 21:54

Цитата:
Originally posted by Trurl
[b]....
SafeArrayCreate
......
SafeArrayCreateVector
......
и т.д.
В крайнем случае, можно и через HeapAlloc, а потом все ручками заполнить.
Вопрос только в том, даст ли BlackBox присвоить типизированному указателю значение нетипизированного. Судя по описанию языка - не даст. Если только нет каких-нибуть compiler-magic.
Ответить с цитированием
  (#7 (permalink)) Старый
S.Yu.Gubanov S.Yu.Gubanov вне форума
Member
 
Сообщений: 587
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 03.12.2002
По умолчанию 29.11.2005, 12:06

Цитата:
Originally posted by sacred1972
[b]Вопрос только в том, даст ли BlackBox присвоить типизированному указателю значение нетипизированного. Судя по описанию языка - не даст. Если только нет каких-нибуть compiler-magic.
Приведение любых типов вручную (методом грубой силы):
Код:
IMPORT SYSTEM;

VAR a1: Type1; a2: Type2;
BEGIN
  ...
  a1 := SYSTEM.VAL(Type1, a2);
Ответить с цитированием
  (#8 (permalink)) Старый
sacred1972 sacred1972 вне форума
Member
 
Сообщений: 21
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.07.2005
По умолчанию 29.11.2005, 21:42

Насколько я понимаю получить помощью этой процедуры тип:
Код:
rgvarg*: POINTER TO ARRAY [untagged] OF VARIANTARG;
всё равно не получится, так как он безымянный. Есть ещё варианты, кроме исправления модуля WinOleAut?
Ответить с цитированием
  (#9 (permalink)) Старый
sacred1972 sacred1972 вне форума
Member
 
Сообщений: 21
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 21.07.2005
По умолчанию 29.11.2005, 22:14

Нашёл, как говорится Эврика!
Код:
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 - число параметров вызываемого метода.

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

Опции темы
Опции просмотра

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как заполнить поле в таблице из запроса mico C++ Builder 4 08.11.2010 03:46
Как в цикле заполнить поле Index данными к примеру значения индексов integer wall mico C++ Builder 12 08.06.2010 19:26
Как сделать контейнер на клас а потом его заполнить BigLes Visual C++ 5 13.01.2010 02:14
Нужно создать форму в ней поле с клетками 10 на 8 yarus .NET 6 17.05.2008 22:45
Как в С++ Билдере 6 сделать в ДБГриде вычисляэмое поле или поле с подстановкой значен s_vad C++ Builder 3 16.09.2005 17:31
Как сделать так, чтобы в поле редактирования вывести Html страницу Sl@va Assembler 2 20.04.2005 19:15
Нужно заполнить поверхность черным цветом directdraw и mmx Vudemar Программирование графики 4 04.01.2005 08:04
Как заполнить программно графическое поле в базе данных terega C++ Builder 0 17.05.2004 04:03
Как в MS SQL в вычисляемом поле сделать вызов процедуры Anonymous MSSQL Server 3 07.02.2004 15:40
Нужно посчитать нормальное магнитное поле Земли Anonymous Алгоритмы 11 14.01.2004 11:16
Как сделать так, чтобы при попытке отредактировать поле запрашивался пароль Anonymous Delphi 1 02.11.2003 13:24
Как сделать чтобы в поле Edit можно было только цыфру вводить Anonymous C++ Builder 3 23.03.2003 13:32



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов