ESP не сохраняется при вызове функции / Ошибка выполнения № 0 - PullRequest
0 голосов
/ 16 июля 2011

Я получаю странную ошибку с жалобой на повреждение стека, которую я предполагаю, и я немного отладил ее, но не обнаружил проблему. Я также не могу реализовать nothrow в Visual Studio 2010!

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 Ответ

1 голос
/ 16 июля 2011

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

Это неправильно, соглашение о вызовах отсутствует. По умолчанию это __cdecl, что не так, как объявлено в winsock2.h. Вот почему вы получаете диагностику во время выполнения, после вызова она выталкивает аргументы из стека, что уже было сделано WSAStartup (). Несбалансированный стек является результатом. Исправлено:

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

Фактический используемый декларатор - FAR PASCAL, сетевые API-интерфейсы сильно сохранились с прошлого века. Дайте вашему компилятору немного любви, чтобы предупредить вас об этом, несбалансированные стеки чрезвычайно трудно диагностировать без автоматически сгенерированного кода отладки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...