Вопрос для профессионалов. Подключение к событиям.
От: Sergey Yermack  
Дата: 24.05.01 16:52
Оценка:
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: Вопрос для профессионалов. Подключение к событиям.
От: IT Россия linq2db.com
Дата: 29.05.01 12:38
Оценка:
SY>Отсюда следует, что ни VB ни Delphi даже не догадываются, что "внутри" MyContainerControl "живут" еще и другие COM объекты (ведь они не зарегистрированы во внутренних таблицах VB или Delphi), при этом количество их может изменяться, и каждый из них может генерировать события.

Я бы не утверждал так однозначно. Если VB прочитал .tlb, то ему уже всё известно.

SY>Можно ли из кода MyContainerComtrol создать объект EnclosedObj (не имеющий окна ни на стадии проектирования, ни исполнения) таким способом, чтобы о его существовании узнал клиент (форма и проект VB или Delphi) и смог ловить его события?


Как это сделать на C++ понятно, у VB и Delphi должны быть свои средства, так что это вопрос скорее для профессионалов по VB и Delphi.
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Вопрос для профессионалов. Подключение к событиям.
От: Ярослав Говорунов Украина http://www.helicontech.com
Дата: 29.05.01 20:33
Оценка:
Здравствуйте 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]: Вопрос для профессионалов. Подключение к событиям.
От: K  
Дата: 31.05.01 10:06
Оценка:
Здравствуйте IT, вы писали:

IT>Как это сделать на C++ понятно, у VB и Delphi должны быть свои средства, так что это вопрос скорее для профессионалов по VB и Delphi.

И как это сделать на С++ в пределах топика?
На VB это выглядит как dim withevents MyVar as MyObject, а на плюсах?
Re[3]: Вопрос для профессионалов. Подключение к событиям.
От: IT Россия linq2db.com
Дата: 31.05.01 14:14
Оценка:
K>И как это сделать на С++ в пределах топика?
K>На VB это выглядит как dim withevents MyVar as MyObject, а на плюсах?

Как и для любого другого объекта:
1. Запрашиваешь IConnectionPointContainer
2. Вызываешь FindConnectionPoint для получения IConnectionPoint
3. Вызываешь Advise

А лучше восрользоваться ATL'евской функцией AtlAdvise


ATLAPI AtlAdvise(IUnknown* pUnkCP, IUnknown* pUnk, const IID& iid, LPDWORD pdw)
{
IConnectionPointContainer *pCPC;
IConnectionPoint *pCP;
HRESULT hr = pUnkCP->QueryInterface(
IID_IConnectionPointContainer,(void**)&pCPC);
if (SUCCEEDED(hr)) {
hr = pCPC->FindConnectionPoint(iid, &pCP);
if (SUCCEEDED(hRes)) {
hr = pCP->Advise(pUnk, pdw);
pCP->Release();
}
pCPC->Release();
}
return hr;
}

Ну и потом надо не забыть отписаться от событий.
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Вопрос для профессионалов. Подключение к событиям.
От: VladD2 Российская Империя www.nemerle.org
Дата: 31.05.01 20:29
Оценка:
В приведенной выше идилии забыто о малом о рукопашной реализации диспатча ;)
Большинство событийных интерфейсов ведь диспатчные.

Чем так над собой издеваться, проще сделать так:
http://www.optim.ru/cs/2001/1/comevents/comevents.asp

PS
Кстати я давно говорил глянуть одминов rsdn на наш сайт. Там еще много новых статей.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Вопрос для профессионалов. Подключение к событиям.
От: K  
Дата: 01.06.01 11:41
Оценка:
Здравствуйте VladD2, вы писали:

VD>Чем так над собой издеваться, проще сделать так:

VD>http://www.optim.ru/cs/2001/1/comevents/comevents.asp

А ларчик просто открывался оказывется. Я искал то в WTL, а в ATL думал только всё касаемое серверной стороны конрола. Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.