我正在使用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()来查看我是否在那里遇到访问冲突。
答案 0 :(得分:1)
GetLastError()
方法最有可能调用WSAGetLastError()
。
但要WSAGetLastError()
工作,WSACleanup()
一定不能被调用。
我猜你在删除m_Client
时会发生这种情况。
在删除GetLastError()
对象之前,请尝试调用m_Client
。