1

Я работаю на Visual Studio проект Project A (который генерирует статический LIB на компиляции)Значение ESP не было должным образом сохраняются при вызове функции

имеет класс

using namespace mynamespace; 
class projectAclass 
{ 
    virtual int funct1()=0; //Pure virtual function 
    virtual int funct2()=0; //Pure virtual function 
    virtual int funct3()=0; //Pure virtual function 
}; 

проект B (который генерирует DLL на компиляции)

#define projectBclass_DLL __declspec(dllexport) 
class projectBclass_DLL projectBclass: public mynamespace::projectAclass 
{ 
    //Definitions of the 3 pure virtual functions are here 
    int funct1() 
    { 
    //definition go here 
    } 
    //similarly for funct2 and funct3 

    int funct4() 
{ //Definition goes here } 
    int funct5() 
{ //Definition goes here } 
    int funct6() 
{ //Definition goes here } 
}; 

Теперь из основной функции, созданной в каком-то другом проекте я создал объект класса projectAclass и пытается вызвать функцию funct1, но я не знаю, какой-то другой функции становится называется, которые определены в projectBclass (скажем funct4), когда я пытаюсь отлаживать решение и после возвращения из funct4 Я получаю эту ошибку

Run-Time Check Failure #0 - The value of ESP was not properly saved across a 
function call. This is usually a result of calling a function declared with 
one calling convention with a function pointer declared with a different calling 
convention. 

заранее спасибо

+0

Предполагаю, что вы на самом деле не создали объект класса projectAclass, потому что он абстрактный. – doctorlove

+1

Предупреждение отладчика является лишь побочным эффектом вызванной неправильной функции. Непонятно, почему это происходит, но, конечно, вы никогда не можете вызвать funct4() в объекте projectAclass, он не имеет этой функции и является абстрактным, поэтому никогда не может быть создан, поэтому информация в этом вопросе не может быть точным. –

+0

@ HansPassant Сэр, можете ли вы рассказать мне, как исправить это исключение (ESP был не правильно ....) – Euler

ответ

2

Иногда у вас есть calling conventions неправильно. Иногда перестраивает все будет сортировать его.

+0

Реконструкция решения Не работает – Euler

2

Убедитесь, что статическая библиотека, связанная с вашей dll, dll и (поскольку вы создаете C++ DLL), ваше приложение имеет такую ​​же конфигурацию сборки (DEBUG/RELEASE). Проверьте флаги препроцессора в вашем проекте. Неправильные флажки препроцессора могут приводить к различным таблицам указателей виртуальных функций, и поэтому легко может случиться, что вызывается неправильная функция.

+0

Я проверил, все имеют одинаковую конфигурацию сборки, но все же она дает это исключение – Euler

Смежные вопросы

 Смежные вопросы