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

时间:2011-07-16 14:36:55

标签: c++ winapi

我得到一个奇怪的错误抱怨我正在假设的堆栈损坏,我调试了一下但我还没有发现问题。我似乎也无法在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函数尚未调用 - 因此函数指针有效!

这个错误是阻止我的唯一因素!有人会给我一个指针吗?

1 个答案:

答案 0 :(得分:1)

  

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

那是错的,调用约定缺失了。它默认为__cdecl,这不是在winsock2.h中声明的方式。这就是你获得运行时诊断的原因,在调用之后它会弹出堆栈中的参数,这是WSAStartup()已经完成的。结果是不平衡的堆栈。修正:

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

使用的实际声明者是FAR PASCAL,网络apis在上个世纪得到了很好的保留。让你的编译器有点喜欢警告你,如果没有自动生成的调试代码,不平衡的堆栈很难诊断。