Здравствуйте, Александр Воронин, Вы писали:
АВ>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.