IDispatch. Как в рантайме добавить свойство?

kapuec
Дата: 10.05.2011 17:06:35
Добрый день.

Есть у меня некая коллекция объектов, реализующая IDispatch, каждому элементу которой в соответствии поставлено Имя (отвечающее требованиям IsValidIdent). Хочу, чтоб при добавлении элемента коллекции у моего IDispatch появлялось бы свойство, одноименное с соответствующим именем, причем, чтоб эту информацию можно было бы получить через GetTypeInfo, а не просто имелась бы возможность в коде вызывать этот метод (то есть в GetIDsOfNames и Invoke).

Обыскал весь доступный инет - ничего похожего :-( Подскажите!!!
Michael Longneck
Дата: 10.05.2011 17:14:11
А в TLB кто твоё свойство впишет? Информация хранится в TLB, TLB зарегистрирована. Никакое "налету" тут невозможно.
kapuec
Дата: 10.05.2011 17:22:44
Michael Longneck,

судя во всему Вы правы, хотя если прикинуть - а что собственно мешает? Ведь ничто мне не помешает написать такую реализацию GetIDsOfNames и Invoke, когда в зависимости от наполнения моей коллекции будут доступны новые свойства? Осталась последняя деталь - все это запихнуть в то, что возвращается функцией GetTypeInfo - и все будет вообще красиво.
Michael Longneck
Дата: 10.05.2011 17:43:01
Пользоваться этим будет кто? Вызывать кто будет? Даже если вы напишете свою GetTypeInfo, то не факт что программа клиент перечитывает эту информацию в процессе, а не читает один раз к себе в буфер и больше не вызывает. Да и вообще, если изменение спецификации в версиях - моветон, то уж на лету так совсем.

С моей точки зрения, это попытка применить концептуально неверный способ, не говоря уж о трудностях практических.
kapuec
Дата: 10.05.2011 17:51:25
Ну если вопрос только в оправданности этого пути - извольте. Речь идет о COM объекте, который используется в системе 1С:Предприятие. И вот чтоб объект привычно для одноэсников отображался в окне типа как в дельфях "Local Variables" мне и нужен сабж. В 1С такой подход используется сплошь и рядом.
Michael Longneck
Дата: 10.05.2011 18:09:34
1С не знаю. Но вы хотите сказать, что там такое используется именно в COM а не во внутреннем языке? В Delphi тоже можно написать CustomVariantType с таким поведением. Тем не менее, COM тут не причём. Collection.GetItem(AItemName) кажется более логичной конструкцией.

З.Ы. Вам же ещё понадобятся русские имена свойств, да? :)
kapuec
Дата: 10.05.2011 18:14:44
А в 1С все внутренние типы суть IDispatch. И там из именованных коллекций элементы в коде получают примерно так:

ЭлементКоллекции = Коллекция.ИмяЭлементаКоллекции;

Русские имена тоже бы пригодились, а что и с этим проблема?
Michael Longneck
Дата: 10.05.2011 18:33:44
Гм.... а к похожему 1С-ному объекту из Word VBA скажем можно обратиться вместо Collection.Items(ItemName) через Collection.ItemName? А то может простейшего IEnumVariant хватит?
kapuec
Дата: 10.05.2011 18:50:03
Ну из Word-а к 1С я не подключался, а вот из одной 1С к другой 1С - постоянно. И именно так (Collection.ItemName) там и получаются элементы таких коллекций.
По поводу IEnumVariant - немного не то. Его я тоже реализовал, но только для поддержки языковой конструкции Для Каждого .. Из ... Цикл (да, там такая тоже есть). Еще раз уточню: заставить работать конструкции типа
ЭлементКоллекции = Коллекция.ИмяЭлементаКоллекции;
- это никакая не проблема. Проблема сделать, чтоб было вот так:
Michael Longneck
Дата: 10.05.2011 18:56:29
А там часом нет никакого I1CTypeInfo? Из Word попробуйте, может дело именно в том какие интерфейсы запрашивает 1С. QueryInterface помониторьте.