Причина сбоя без __cdecl заключается в том, что по умолчанию компилятор Windows использует __stdcall. Последнее заставляет функцию вызываемого абонента очистить стек. Следовательно, ваш вызывающий объект выдвигает два аргумента в стек, чтобы вызвать «Trigger», но Trigger выталкивает только один аргумент из стека при выходе из функции. Следовательно, вы терпите крах. __cdecl соглашение о вызовах вроде как обходит это.
Как я уже говорил в моих комментариях выше, использование __cdecl для исправления сбоя скрывает настоящую ошибку. Ваш список аргументов триггера не соответствует списку аргументов, ожидаемому от «MethodHandler». Это, вероятно, причина вашего крушения.
Вероятно, это лучшее решение:
typedef void(Object::*MethodHandler)(Object* sender, EventArgs args);
void Triger(Object* sender, EventArgs args)
{
if(args == "test")
cout << "test args received" << endl;
}
Вы не поделились кодом, который показывает, как «Триггер» регистрируется для последующего обратного вызова. Но я сильно подозреваю, что вы сделали что-то вроде этого:
MethodHandler handler = (MethodHandler)Trigger;
Потому что, если вы этого не сделали, ваш код не скомпилировался. Исправьте ваш код так, чтобы приведение не требовалось для компиляции, и ваша реальная ошибка исчезнет так же, как и ваша ошибка.