Re: Помогите с параметрами ActiveX event-а
От: Vi2 Удмуртия http://www.adem.ru
Дата: 10.10.05 06:34
Оценка: 4 (1)
Здравствуйте, Александр Воронин, Вы писали:

АВ>BEGIN_DISPATCH_MAP(CBacnetDlg, CDialog)
АВ>    DISP_FUNCTION(CBacnetDlg, "Iam", OnBacnetIam, VT_EMPTY, VTS_DISPATCH)
АВ>END_DISPATCH_MAP()

АВ>BEGIN_INTERFACE_MAP(CBacnetDlg, CDialog)
АВ>    INTERFACE_PART(CBacnetDlg, DIID__IApplicationLayerEvents, Dispatch)
АВ>END_INTERFACE_MAP()

АВ>void CBacnetDlg::OnBacnetIam(IIam *srv)
АВ>{
АВ>  long x = srv->network;
АВ>  // тут падаем:( ... network - "long IIam::network"

VTS_DISPATCH означает передачу именно IDispatch* указателя. Поэтому перед использованием в качестве IIam нужно сделать QueryInterface. Поэтому лучше привести к нормальному (ожидаемому) виду void CBacnetDlg::OnBacnetIam(IDispatch *srv). Тогда и ошибка обращения будет очевидной.

К тому же, DIID означает dispinterface, параметры которого передаются в VARIANTах, в которых можно передать или IUnknown*, или IDispatch*. Никаких других типов указателя передать не получится. Перевод в нужный интерфейс осуществляется обработчиком Invoke при распаковке по библиотеке типов. В твоем же случае распаковка идет по указанному тобой параметру, т.е. VTS_DISPATCH. Соответственно, обработчик понятия не имеет о интерфейсе IIam.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.