Отлаживаю генерацию событий. Есть следующий код для поиска процедуры в модуле:
m_ProcNum = pModule->FindProc (ProcName.c_str (), FALSE);
if (m_ProcNum == -1) m_ProcNum = pModule->FindProc (ProcName.c_str (), TRUE);
if (m_ProcNum == -1)
throw std::logic_error ("Указанный обработчик события не найден");
m_pModule = pModule;
CBLProcInfo ProcInfo;
if (!pModule->GetProcInfo (m_ProcNum, ProcInfo))
throw std::runtime_error ("Не удалось получить данные об обработчике");
m_NumArgs = ProcInfo.GetNParams ();
Этот нормально работает для обычных модулей вообще везде. Если же требуется работать с ГМ, начинаются проблемы. Симптомы следующие:
1) Без 1С++ работает нормально.
2) При наличии 1С++ 2.5 без Формекс работает нормально.
3) При наличии 1С++ 2.0 вылетает на строке "m_NumArgs = ProcInfo.GetNParams ();"
4) При наличии 1С++ 2.5 с какой-то старой версией Формекс эта строка отрабатывает нормально, но в качестве количества параметров выдается мусор - в результате падает в другом месте.
5) При наличии 1С++ 2.5 с последней версией Формекс работает нормально.
Запуск дебагерной сборки 1С++ 2.0 под отладчиком дает следующие результаты:
1) Падает на коде:
int CWrapModule::FindFunction(char const * lpFnName)const
{
int i;
for (i = 0;glFnNames[i].rusName != NULL;i++){
if (!stricmp(lpFnName,glFnNames[i].rusName)) // ЗДЕСЬ ПАДАЕТ
return i;
if (!stricmp(lpFnName,glFnNames[i].engName))
return i;
}
return -1;
};
2) Стек вызовов такой:
> 1CPP.dll!CWrapModule::FindFunction() Line 266 + 0x17 bytes C++
1CPP.dll!CWrapModule::WrapFindFunc() Line 360 + 0xc bytes C++
1CPP.dll!CWrapModule::WrapGetNParams() Line 318 + 0x1b bytes C++
По симптомам выходит, что где-то в функционале Формекс есть баг. Этот баг исправлен в последних сборках Формекс, но в его варианте 1С++ 2.0 этот баг остался. К сожалению, я совсем в не в курсе как устроен работающий там код, а разбираться времени нет, да и есть вещи поинтереснее
Но, возможно, кто-то в этом коде разбирается лучше и исправить этот баг ему будет проще. Было бы неплохо
Пока что я для себя вижу только один выход "добиться совместимости" - отказаться от генерации событий для ГМ и генерить их только для обычных модулей. Или сделать такую генерацию опциональной.