VC ++ 6.0:为什么CASyncSocket :: GetLastError()导致访问冲突?

时间:2010-01-12 14:56:37

标签: visual-c++ mfc casyncsocket

我正在使用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-&gt; Connect()的调用将返回错误,因此它将进入IF块。 CAsyncSocket :: GetLastError()然后调试器打开并报告0xC0000005访问冲突。我不明白这些东西足以从反汇编中获得任何东西。

我也尝试过使用相同结果的CSocket :: GetLastError()和m_Client-&gt; GetLastError()。

我很确定m_Client-&gt; Connect()失败是因为开发系统上没有生产机器上的某些安全策略,但是我想得到实际的错误代码,这样我才能帮助那家伙缩小他的搜索范围。

我还没有尝试在我的构建系统上强制调用GetLastError()来查看我是否在那里遇到访问冲突。

1 个答案:

答案 0 :(得分:1)

GetLastError()方法最有可能调用WSAGetLastError()。 但要WSAGetLastError()工作,WSACleanup()一定不能被调用。 我猜你在删除m_Client时会发生这种情况。 在删除GetLastError()对象之前,请尝试调用m_Client