Эта ошибка отладки означает, что регистр указателя стека не возвращается к своему первоначальному значению после вызова функции, то есть, что число толкает до вызова функции не сопровождалось равным числом всплывает после звонка.
Мне известны две причины (обе с динамически загружаемыми библиотеками). # 1 - это то, что VC ++ описывает в сообщении об ошибке, но я не думаю, что это самая частая причина ошибки (см. # 2).
1) Несоответствующие правила вызова:
Звонящий и вызываемый не имеют надлежащего соглашения о том, кто и что собирается делать. Например, если вы вызываете функцию DLL, которая является _stdcall
, но вы по какой-то причине объявили ее как _cdecl
(по умолчанию в VC ++) в вашем вызове. Это часто случается, если вы используете разные языки в разных модулях и т. Д.
Вы должны проверить объявление функции-нарушителя и убедиться, что она объявлена не дважды, а по-другому.
2) Несоответствующие типы:
Вызывающий и вызываемый не скомпилированы с одними и теми же типами. Например, общий заголовок определяет типы в API и недавно изменился, и один модуль был перекомпилирован, а другой - нет, т.е. некоторые типы могут иметь разные размеры в вызывающем и вызываемом объектах.
В этом случае вызывающий объект выдвигает аргументы одного размера, но вызываемый (если вы используете _stdcall
, когда вызываемый объект очищает стек) отображает другой размер. Таким образом, ESP не возвращается к правильному значению.
(Конечно, эти и другие аргументы, представленные ниже, могут показаться искаженными в вызываемой функции, но иногда вы можете пережить это без видимого сбоя.)
Если у вас есть доступ ко всему коду, просто перекомпилируйте его.