Проблема с обработкой событий от ActivXа
От: Advance  
Дата: 20.06.02 15:05
Оценка:
Помогите пожалуйста, мозг взрывается уже.
Проблема такова.
Поключился к событиям некоего АктивХ контрола. (TeeChart, может кто сталкивался)
в "событийнтом" интерфейсе контрола есть методы, принимаюшие параметры нестандартных типов. Примерно так

typedef [...]
    enum { ssShift = 1,
        ssAlt = 2,
        ssCtrl = 4,
        ssNone = 0
    } EShiftState;

    [...    ]
    dispinterface ITChartEvents {
        properties:
        methods:
            void OnMouseMove( [in] EShiftState Shift, [in] long X, [in] long Y);
    };



У себя реакцию на событие описываю как

[сcode]
void __stdcall OnMouseMoveTChart(EShiftState Shift, long X, long Y) ;
[/сcode]

Добавляю ее в карту :

 SINK_ENTRY_EX(1, __uuidof(ITChartEvents), 0x14 , OnMouseMoveTChart)



При перемещении мышки над контролом вываливается ассерт на строчку в атлсом.н

HRESULT hr = DispCallFunc(&thunk, 0, info.cc, info.vtReturn, info.nParams, info.pVarTypes, pVarArgs, Result);
ATLASSERT(SUCCEEDED(hr));


hr соответсвует E_BADARG.

Все остальные события, которые приходят от контрола, но содержат аргументы только простых типов (long, bool), приходят нормально, ассерта не вызывают. Проблема только с enum-ами. Нет чтоб лонгами их описать...

Как я понял, в DispCallFunc происходит попытка вызвать мою функцию OnMouseMoveTChart. Пришли к ней из IDispEventImpl::Invoke. Шли долго, но пришли правильно. Сама DispCallFunc находится в OleAuto.dll.
Вот что заметил странного в ее аргументах, когда собираемся вызвать OnMouseMoveTChart: тип первого параметра (EShiftState Shift) в info.pVarTypes (это массив типов агруметов) проходит как VT_USERDEFINED, а в pVarArgs (массиве самих аргументов) как VT_I4. Видимо собака порылась в этом, но что с этим делать мне непонятно.
Подскажите пожалста, как быть
Спасибо.
Сергей.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.