0

我正在使用 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() 失败是因为生产机器上的一些安全策略在开发系统上不存在,但我想获得实际的错误代码,以便帮助 IT 人员缩小他的范围搜索。

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

4

1 回答 1

1

GetLastError()方法最有可能调用WSAGetLastError(). 但是为了WSAGetLastError()工作,WSACleanup()一定还没有被调用。我猜当你删除m_Client它时,就会发生这种情况。GetLastError()在删除m_Client对象之前尝试调用。

于 2010-01-12T15:48:24.840 回答