powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как вернуть _Collection из COM-объекта?
14 сообщений из 14, страница 1 из 1
Как вернуть _Collection из COM-объекта?
    #32490911
Антон Петров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет все.

Есть DLL, сделанная с помощью ATL. Надо, чтобы функция возвращала VB-шную коллекцию, т.е. чтобы из VB было видно: Property Get colFunc() As Collection.
В классе пишу #import "msvbvm60.dll" no_namespace. Коллекции доступны.
В .idl:

importlib("msvbvm60.dll")
...
[propget, id(1), helpstring("property colPorts")] HRESULT colPorts([out, retval] _Collection** pVal);

Ругается: error C2061: syntax error : identifier '_Collection'
Есть у кого идеи?
...
Рейтинг: 0 / 0
Как вернуть _Collection из COM-объекта?
    #32491029
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Collection не является стандартным типом в языке описания интерфесов.
Видимо, придётся через варианты и указатели...
...
Рейтинг: 0 / 0
Как вернуть _Collection из COM-объекта?
    #32491186
Антон Петров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А разве возвращать можно только стандартные типы IDL? Вот что глаголет MSDN:

Ask Dr. GUI #45Dear Dr. GUI,
How do I return an ADO recordset from a method in a VC++ COM object?

Jim Hocking

Dr. GUI replies:
Returning an ADO recordset from C++ requires that you tweak your IDL a bit. Inside the library section, add the following line as the last importlib statement:

importlib("C:\Program Files\Common Files\System\ado\msado15.dll");

(Of course, modify the path to suit your system.)

This will give you a declaration of, among other things, _Recordset.

Once you have this declaration, you can write the IDL for a method that returns a _Recordset:

[id(1), helpstring("Get Recordset")]
HRESULT GetRs([in] BSTR strQuery, [out,retval] _Recordset **ppRs);


Чем коллекция хуже набора записей?
...
Рейтинг: 0 / 0
Как вернуть _Collection из COM-объекта?
    #32491611
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ок, уболтал :)

Тогда так:
При импорте

importlib("msvbvm60.dll")

должны сгенерится tlh и tli

в tlh должно быть описание '_Collection'
а похоже, что его там нет (может синтаксис другой...)
ищи
...
Рейтинг: 0 / 0
Как вернуть _Collection из COM-объекта?
    #32491671
Антон Петров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ан есть!

msvbvm60.tlh:

struct __declspec(uuid("a4c46780-499f-101b-bb78-00aa00383cbb"))
_Collection : IDispatch
...
Рейтинг: 0 / 0
Как вернуть _Collection из COM-объекта?
    #32492924
Антон Петров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Народ безмолвствует... Видать не судьба...
...
Рейтинг: 0 / 0
Как вернуть _Collection из COM-объекта?
    #32492958
Антон Петров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А кто ж за меня вставит #include "msvbvm60.tlh"?! :)
И #import тогда не нужен.
...
Рейтинг: 0 / 0
Как вернуть _Collection из COM-объекта?
    #32492969
Антон Петров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не-е, опять гоню. #import "msvbvm60.dll" no_namespace в StdAfx.h и
importlib("msvbvm60.dll") в .idl. Вот всё, что надо.
...
Рейтинг: 0 / 0
Как вернуть _Collection из COM-объекта?
    #32493255
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так заработало или нет? :)
...
Рейтинг: 0 / 0
Как вернуть _Collection из COM-объекта?
    #32494480
Антон Петров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да ни фига не заработало. Т.е. компилируется уже нормально. И в VB-шном браузере объектов всё пристойно выглядит.
Но смарт-пойнтер на Collection не хочет зараза работать!
Это прокатывает нормально:
_CollectionPtr spCol;
spCol.CreateInstance(__uuidof(Collection));
Но как доходит до первого же spCol->, так сразу кирдык. Делаю всё совершенно аналогично вышеприведённому примеру с рекордсетом. В чём грабли, не понимаю...
...
Рейтинг: 0 / 0
Как вернуть _Collection из COM-объекта?
    #32494485
Антон Петров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рекордсет-то нормально в бейсик выдаётся!
...
Рейтинг: 0 / 0
Как вернуть _Collection из COM-объекта?
    #32494818
Антон Петров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Visual Basic For Applications - какая-то неправильная библиотека. В ней наверно неправильные компоненты. OLE Viewer ругается, что библиотека не зарегистрирована. Но VB же с ней работает! Ничего не понимаю...
...
Рейтинг: 0 / 0
Как вернуть _Collection из COM-объекта?
    #32496376
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторВ ней наверно неправильные компоненты.
("это неправильные пчёлы")
Да, я уже слышал, народ на VBA жалуется.
То, что VB его понимает - может быть фичность самого VB. (а может и нет...)
Может они там для каких-нить целей код подправили в VBA, к примеру, для быстроты/простоты/ещё_чего-то в VB и VB с VBA теперь друг друга хорошо понимают, а остальные их нет. Кстати, когда я с ними работал, такое впечатление у меня было (может просто у меня руки кривые).

Вооот...
Поэтому, 2 варианта:
Либо чё-то не так в Вашей проге.
Либо VBA глючит и придётся Вам выкручиваться какими-то обходными всякими способами (с глюками бороться).
...
Рейтинг: 0 / 0
Как вернуть _Collection из COM-объекта?
    #32496499
Антон Петров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор("это неправильные пчёлы")
Да, я уже слышал, народ на VBA жалуется.
То, что VB его понимает - может быть фичность самого VB. (а может и нет...)
Может они там для каких-нить целей код подправили в VBA, к примеру, для быстроты/простоты/ещё_чего-то в VB и VB с VBA теперь друг друга хорошо понимают, а остальные их нет.

Похоже на то.

авторКстати, когда я с ними работал, такое впечатление у меня было (может просто у меня руки кривые).
У меня такого впечатления до недавних пор не было.


Либо чё-то не так в Вашей проге.

Уж не знаю. С другими библиотеками нормально. Тогда пришлось бы признать, что и в OLE/COM Viewer чё-то не так.


Либо VBA глючит и придётся Вам выкручиваться какими-то обходными всякими способами (с глюками бороться).

А именно: взять и написать на VC свои собственные коллекции. Что и было сделано.
Благодарю за участие.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как вернуть _Collection из COM-объекта?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]