ESP在函数调用中没有保存/运行时错误#0

ESP Not saved across function call / Runtime Error #0

本文关键字:保存 运行时错误 函数调用 ESP      更新时间:2023-10-16

我得到一个奇怪的错误,抱怨堆栈损坏我假设,我已经调试了一点,但我还没有发现这个问题。我似乎也无法在Visual Studio 2010中实现nothrow !

XYZ::XYZ(char * d)
{
    hostname = new char[HOSTNAME_LENGTH];
    ip = new char[IP_ADDR_LENGTH];
    /*Dynamic Memory*/
    memset(hostname, 0, HOSTNAME_LENGTH);
    memset(ip, 0, IP_ADDR_LENGTH);
    //strncpy(hostname, d, HOSTNAME_LENGTH);
    if(dWSAStartup(MAKEWORD(2,2), &wsd) == 0) //Crashes Here!
    //And so on..

dWSAStartup从ws2_32.dll动态链接,并具有正确的函数参数类型转换:

typedef int (*WSAS)(WORD, LPWSADATA); //WSAStartup

没有,FreeLibrary函数没有被调用——所以函数指针是有效的!

这个bug是唯一阻止我的东西!有人能给我扔个指针吗?

typepedef int (*WSAS)(WORD, LPWSADATA);//WSAStartup

这是错误的,调用约定丢失了。它默认为__cdecl,这与winsock2.h中的声明方式不同。这就是为什么你得到运行时诊断,在调用之后,它从堆栈弹出参数,一些已经由WSAStartup()完成的事情。结果是一个不平衡的堆栈。解决办法:

typedef int (__stdcall * WSAS)(WORD, LPWSADATA); //WSAStartup

实际使用的声明器是FAR PASCAL,网络api强烈保留了上个世纪的内容。如果没有自动生成的调试代码,不平衡的堆栈是非常难以诊断的。