Помогите пожалуйста, мозг взрывается уже.
Проблема такова.
Поключился к событиям некоего АктивХ контрола. (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. Видимо собака порылась в этом, но что с этим делать мне непонятно.
Подскажите пожалста, как быть
Спасибо.
Сергей.