VC ++ 6.0: Почему CASyncSocket :: GetLastError () вызывает нарушение прав доступа? - PullRequest
0 голосов
/ 12 января 2010

Я использую Visual C ++ 6.0. Я не уверен в уровне пакета обновления установки Visual Studio, но ОС Win 2K SP4. Код ошибки является частью DLL.

Вот код:

EIO::OpenConnection()
{
    m_Client = new CSocket();

    if(m_Client->Create() == 0) {
        delete m_Client;
        m_Client = NULL;
        return CAsyncSocket::GetLastError();
    }

    if (!m_Client->Connect((LPCTSTR)m_IPAddress, 7)) {
        delete m_Client;
        m_Client = NULL;
        return CAsyncSocket::GetLastError();
    }

    ...<stuff>...
}

Это компилируется без ошибок в моей системе сборки и выполняется без сбоев ни одного из вызовов методов m_Client. Когда я перемещаю эту DLL в производственную систему (Win 2K, пока не уверен в уровне пакета обновления), вызов m_Client-> Connect () возвращает ошибку, поэтому он переходит в блок IF. CAsyncSocket :: GetLastError () затем откройте отладчик и сообщите о нарушении доступа 0xC0000005. Я недостаточно разбираюсь в этих вещах, чтобы что-то извлечь из разборки.

Я также попробовал CSocket :: GetLastError () и m_Client-> GetLastError () с теми же результатами.

Я вполне уверен, что m_Client-> Connect () завершится неудачно из-за какой-то политики безопасности на рабочей машине, которая отсутствует в системе разработки, но я хотел бы получить реальный код ошибки, чтобы я мог помочь ИТ парень сузить круг поиска.

Я еще не пытался принудительно вызвать GetLastError () в моей системе сборки, чтобы узнать, получаю ли я там нарушение прав доступа.

1 Ответ

1 голос
/ 12 января 2010

Метод GetLastError(), скорее всего, вызывает WSAGetLastError(). Но чтобы WSAGetLastError() работал, WSACleanup() еще не был вызван. Я предполагаю, что когда вы удаляете m_Client, именно это и происходит. Попробуйте позвонить GetLastError() перед удалением объекта m_Client.

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