ATL только начинаю осваивать, поэтому, возможно, вопрос сформулирую не очень точно, но постараюсь :)
Есть объект сконструированный как Full ATL control. Назовем его MyContainerControl.
Имеет ,естественно, свойства, методы и события, интерфейсы дуальные. Предполагается, что MyContainerControl будет использоваться как ActiveX cоntrol в проектах на VB и Delphi.
В сервере (dll) и библиотеке (tlb) мною написан и описан еще один объект, названный например EnclosedObj. Последний реализован как Simple object и не имеет ни окна ни IQuickActivate ни других интерфейсов, которые позволяли бы "положить" его на форму VB и обращаться с ним как с обычным ActiveX control'ом (собственно это и не контрол). Тем не менее, кроме свойств и методов EnclosedObj имеет IConnectionPoint и способен генерировать некоторые события.
В MyContainerControl есть внутренний динамическим массив arpObjArray[], в котором храняться указатели на объекты типа EnclosedObj. Последние могут создаваться при потребности из кода MyContainerControl с помощью оператора new. Подчеркиваю, внутри кода MyContainerControl, а не из кода в программе на VB и Delphi.
Отсюда следует, что ни VB ни Delphi даже не догадываются, что "внутри" MyContainerControl "живут" еще и другие COM объекты (ведь они не зарегистрированы во внутренних таблицах VB или Delphi), при этом количество их может изменяться, и каждый из них может генерировать события.
Доступ к конкретному EnclosedObj (в коде VB или Delphi) осуществляется примерно так:
MyContainerControl1.EnclosedObjects(2)
или
MyContainerControl1.EnclosedObjects.Item(2)
Для аналогии с приведенной архитектурой приведу такой пример из Excel:
ThisWorkbook.Sheets(2) — для доступа к рабочему листу.
Все у меня работает, кроме одного. Предложите, как ловить события от объектов EnclosedObj, хранящися в коллекции EnclosedObjects, да еще различать их в коде на VB, например:
Sub EnclosedObj2_OnReadyStatus()
....
Как заставить VB и Delphi увидеть, что в проекте присутствуют и эти объекты, а не только MyContainerControl?
Можно ли из кода MyContainerComtrol создать объект EnclosedObj (не имеющий окна ни на стадии проектирования, ни исполнения) таким способом, чтобы о его существовании узнал клиент (форма и проект VB или Delphi) и смог ловить его события?
Re: Вопрос для профессионалов. Подключение к событиям.
SY>Отсюда следует, что ни VB ни Delphi даже не догадываются, что "внутри" MyContainerControl "живут" еще и другие COM объекты (ведь они не зарегистрированы во внутренних таблицах VB или Delphi), при этом количество их может изменяться, и каждый из них может генерировать события.
Я бы не утверждал так однозначно. Если VB прочитал .tlb, то ему уже всё известно.
SY>Можно ли из кода MyContainerComtrol создать объект EnclosedObj (не имеющий окна ни на стадии проектирования, ни исполнения) таким способом, чтобы о его существовании узнал клиент (форма и проект VB или Delphi) и смог ловить его события?
Как это сделать на C++ понятно, у VB и Delphi должны быть свои средства, так что это вопрос скорее для профессионалов по VB и Delphi.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Вопрос для профессионалов. Подключение к событиям.
Здравствуйте IT, вы писали:
SY>>Отсюда следует, что ни VB ни Delphi даже не догадываются, что "внутри" MyContainerControl "живут" еще и другие COM объекты (ведь они не зарегистрированы во внутренних таблицах VB или Delphi), при этом количество их может изменяться, и каждый из них может генерировать события.
IT>Я бы не утверждал так однозначно. Если VB прочитал .tlb, то ему уже всё известно.
SY>>Можно ли из кода MyContainerComtrol создать объект EnclosedObj (не имеющий окна ни на стадии проектирования, ни исполнения) таким способом, чтобы о его существовании узнал клиент (форма и проект VB или Delphi) и смог ловить его события?
IT>Как это сделать на C++ понятно, у VB и Delphi должны быть свои средства, так что это вопрос скорее для профессионалов по VB и Delphi.
Точно.
Проверить негде, но для VB думаю так:
Dim WithEvents EnclObj1 as MyContainerControl.EnclosedObject
..................................
Sub EnclObj1_OnReadyStatus()
.................
End Sub
.........................
Set EncObj1 = MyContainerControl1.EnclosedObjects(2)
WBR,
Yaroslav Govorunov
Re[2]: Вопрос для профессионалов. Подключение к событиям.
Здравствуйте IT, вы писали:
IT>Как это сделать на C++ понятно, у VB и Delphi должны быть свои средства, так что это вопрос скорее для профессионалов по VB и Delphi.
И как это сделать на С++ в пределах топика?
На VB это выглядит как dim withevents MyVar as MyObject, а на плюсах?
Re[3]: Вопрос для профессионалов. Подключение к событиям.
K>И как это сделать на С++ в пределах топика? K>На VB это выглядит как dim withevents MyVar as MyObject, а на плюсах?
Как и для любого другого объекта:
1. Запрашиваешь IConnectionPointContainer
2. Вызываешь FindConnectionPoint для получения IConnectionPoint
3. Вызываешь Advise
А лучше восрользоваться ATL'евской функцией AtlAdvise