Как сделать COM Indexed property
От: dandreev Россия  
Дата: 22.05.02 08:36
Оценка:
Никто в двух словах не подскажет (может midl синтаксис какой)
как сделать на ATL COM обьект с string-indexed Property
т.е. чтобы в VB например срабатывали конструкции вида

instance["someValue"].maybe_funct()
Re: Как сделать COM Indexed property
От: Vi2 Удмуртия http://www.adem.ru
Дата: 22.05.02 08:54
Оценка:
Здравствуйте dandreev, Вы писали:

D>Никто в двух словах не подскажет (может midl синтаксис какой)

D>как сделать на ATL COM обьект с string-indexed Property
D>т.е. чтобы в VB например срабатывали конструкции вида

D>instance["someValue"].maybe_funct()


Ну, этот синтаксис вообще ошибочен.
Или instance("someValue").maybe_funct()
или instance!someValue.maybe_funct()

В любом случае объект instance должен обладать свойством по-умолчанию, имеющем dispid=0
[id(0)] метод
или
[id(DISPID_VALUE)] метод

Причём нужно, чтобы в твоём случае этот метод (свойство) возвращал объект, т.е. указатель на некоторый интерфейс с функцией maybe_funct.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: Как сделать COM Indexed property
От: Vi2 Удмуртия http://www.adem.ru
Дата: 22.05.02 09:05
Оценка:
Нужно добавление по сути вопроса

[id(DISPID_VALUE), ... ] метод([in] BSTR строка_параметра );
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[3]: Как сделать COM Indexed property
От: Vi2 Удмуртия http://www.adem.ru
Дата: 22.05.02 09:07
Оценка:
Нужно добавление по сути вопроса

[id(DISPID_VALUE), ... ] метод([in] BSTR строка_параметра, [out,retval] Ixxxx* *ppObj );


Ох, уж эта торопливость.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re: Как сделать COM Indexed property
От: dandreev Россия  
Дата: 22.05.02 12:52
Оценка:
Спасибо, с этим разобрался. Но теперь другая проблема.
для конструкции for each завел метод _NewEnum, имплементировал IEnumVARIANT.
Но при вызове из VB for each type in list выводится сообщение RuntimeError 13 type mismatch

Может я что то упустил, и кроме имплементации _NewEnum (DISPID_NEWENUM) требуеттся еще какие нибудь действия чтобы заработал for each?
Re[2]: Про коллекции
От: Vi2 Удмуртия http://www.adem.ru
Дата: 22.05.02 13:11
Оценка:
Здравствуйте dandreev, Вы писали:

D>Спасибо, с этим разобрался. Но теперь другая проблема.

D>для конструкции for each завел метод _NewEnum, имплементировал IEnumVARIANT.
D>Но при вызове из VB for each type in list выводится сообщение RuntimeError 13 type mismatch

D>Может я что то упустил, и кроме имплементации _NewEnum (DISPID_NEWENUM) требуеттся еще какие нибудь действия чтобы заработал for each?


Посмотри статью на RSDN Создание COM-коллекций
Автор(ы): Владислав Чистяков

Ничего сложного там нет, но если будут вопросы, то лучше задать новым сообщением. Добавляй только код (сколько нужно и с форматированием).
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: Как сделать COM Indexed property
От: green.nsk  
Дата: 25.08.06 09:53
Оценка:
Может кто подскажет, как на MIDL описать deafult indexed property, если это можно вообще

Ведь код:

Vi2>
Vi2>[id(DISPID_VALUE), ... ] метод([in] BSTR строка_параметра, [out,retval] Ixxxx* *ppObj );
Vi2>


даст возможность писать
instance.метод("someValue").maybe_funct()

а хочется
instance("someValue").maybe_funct()

ps может быть ещё в IDL есть возможность написать, что функция ничего кроме S_OK никогда не возвращает?
Re[5]: Как сделать COM Indexed property
От: Аноним  
Дата: 25.08.06 12:04
Оценка:
Здравствуйте, green.nsk, Вы писали:

GN>Может кто подскажет, как на MIDL описать deafult indexed property, если это можно вообще


GN>Ведь код:


Vi2>>
Vi2>>[id(DISPID_VALUE), ... ] метод([in] BSTR строка_параметра, [out,retval] Ixxxx* *ppObj );
Vi2>>


GN>даст возможность писать

GN>instance.метод("someValue").maybe_funct()

GN>а хочется

GN>instance("someValue").maybe_funct()

GN>ps может быть ещё в IDL есть возможность написать, что функция ничего кроме S_OK никогда не возвращает?


Насколько я помню (хотя, вероятнее всего, как всегда ошибаюсь) то DISPID_VALUE == 0, таким макаром задается метод по умолчанию. Так что все вроде правильно
Re[6]: Как сделать COM Indexed property
От: green.nsk  
Дата: 25.08.06 17:06
Оценка:
А>Насколько я помню (хотя, вероятнее всего, как всегда ошибаюсь) то DISPID_VALUE == 0, таким макаром задается метод по умолчанию. Так что все вроде правильно

мм.. почему-то даже в голову не пришло, что DISPID_VALUE — это стандартный макрос

Спасибо.
Re[7]: не догадался поискать в форуме atl
От: green.nsk  
Дата: 25.08.06 17:08
Оценка:
а там уже был ответ: http://rsdn.ru/Forum/?mid=56540
Автор: dandreev
Дата: 22.05.02
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.