C++ &引用;ESP的值未在函数调用中正确保存。”;问题

C++ &引用;ESP的值未在函数调用中正确保存。”;问题,c++,x86,stack,C++,X86,Stack,可能重复: 我有一个OBJ文件,我没有任何源代码。我在另一个项目中使用了它,没有任何问题。现在我正试图在另一个项目中使用它。以下是我声明的方式: extern "C" bool FileCompare(char* file1, char* file2); 我在这样的函数中使用它: void myFunction() { //some code FileCompare(file1, file2); // file1 and 2 are char arrays } 然后在我的主

可能重复:

我有一个OBJ文件,我没有任何源代码。我在另一个项目中使用了它,没有任何问题。现在我正试图在另一个项目中使用它。以下是我声明的方式:

extern "C" bool FileCompare(char* file1, char* file2);
我在这样的函数中使用它:

void myFunction() {
    //some code
    FileCompare(file1, file2); // file1 and 2 are char arrays
}
然后在我的主代码中调用myFunction:

int main() {
    ... some code
    myFunction()
}
当myFunction返回时,我在VisualStudio2010调试器中得到“ESP的值未在函数调用中正确保存”。然而,我知道FileCompares(obj文件中的函数)完成了它的工作。当我把它评论出来时,一切都很好。我过去使用过这个OBJ文件,没有任何问题。考虑到我没有obj文件的源代码,我能做些什么来“修补”这个问题吗

多谢各位


更多细节:我怀疑代码使用的调用没有RET(它是在程序集中编写的)


编辑:我不知道我所说的是否有道理,但由于函数损坏了esp,因此在函数返回后,esp是否可以保存并还原它?

这可能是由于
FileCompare()
中的错误,或者
myFunction()的声明和实现之间的调用约定不匹配
和/或
文件比较()

您可以在
FileCompare()
的原型上使用适当的说明符(比如
\uuu cdecl
)来解决此问题。或者您可能需要为修复问题的
FileCompare()
函数创建汇编语言包装(因为您说您不再有
FileCompare()
的源代码)


如果不使用
FileCompare()
源代码,则可能需要在调试器中彻底检查程序集。

当我针对与最新版本不同的旧头文件编译一个项目时,遇到了类似的问题,因为缺少了一个虚拟函数。

obj文件也是用VS2010编译的吗?有没有SP1?或者:。OBJ文件是用masmMore细节编写和编译的:我怀疑代码使用了CALL而没有RET(它是在汇编中编写的)。你说的“代码使用CALL而没有RET”到底是什么意思?+1是一个好答案,但他说他“在另一个项目中使用了它,没有任何问题”。。。所以我想知道这两个项目之间有什么不同?@Nemo:搞砸
ESP
并不总是会导致明显的问题-如果
EBP
被用作帧寄存器,那么局部变量仍然可以访问,调用方完成后,
ESP
通常会被恢复,因为通常只需将
EBP
移入即可恢复。换句话说,这取决于工具和具体情况,取决于是否会被注意到。