(急救) dll中使用CAsyncSocket,在FreeLibrary时,CAsyncSocket的Close出错???
dll为win32,动态链接到MFC库
导出函数:
CClientSocket g_mySocket;
bool WINAPI ConnectToServer(CString strServerIP, int nPort, HWND hWnd, UINT Msg)
{
//句柄与消息做传回调用EXE用
g_mySocket.Create(0, SOCK_STREAM, FD_READ | FD_WRITE | FD_CONNECT | FD_CLOSE, NULL);
g_mySocket.Connect((LPCTSTR)strServerIP, nPort);//127.0.0.1
DWORD dwError = ::WSAGetLastError();
if (dwError != WSAEWOULDBLOCK )
return false;
AfxMessageBox( "开始连接 ");
return true;
}
注:CClientSocket继承CAsyncSocket,仅实现OnConnect,当连接成功失败弹出提示
调用DLL:
HINSTANCE hInst = LoadLibrary( "TestStock.dll ");
if (NULL == hInst)
return;
typedef bool (WINAPI *ConnectProc)(CString strServerIP, int nPort, HWND hWnd, UINT Msg);
ConnectProc ConnectToServer = (ConnectProc)GetProcAddress( hInst, "ConnectToServer ");
if (!ConnectToServer)
{
AfxMessageBox( "函数地址获取失败 ");
return;
}
CString strServerIP = "192.168.0.101 ";
int nPort=5299;
ConnectToServer(strServerIP, nPort, this-> m_hWnd, WM_CONNECTSUCCESS);
FreeLibrary(hInst);
问题:
能正确反应是否连接上服务端,即OnConnect事件正确响应,但在FreeLibrary(hInst); 时出错,跟踪了下:
是释放DLL时,CAsyncSocket在析构中调用Close时
void CAsyncSocket::Close()
{
if (m_hSocket != INVALID_SOCKET)
{
VERIFY(SOCKET_ERROR != closesocket(m_hSocket));
CAsyncSocket::KillSocket(m_hSocket, this);
m_hSocket = INVALID_SOCKET;
}
}
调用KillSocket时在下面这句ASSERT(CAsyncSocket::LookupHandle(hSocket, FALSE) != NULL);
看了下LookupHandle实现
CAsyncSocket* PASCAL CAsyncSocket::LookupHandle(SOCKET hSocket, BOOL bDead)
{
CAsyncSocket* pSocket;
_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
if (!bDead)
{
pSocket = (CAsyncSocket*)
pState-> m_pmapSocketHandle-> GetValueAt((void*)hSocket);
if (pSocket != NULL)
return pSocket;
}
else
{
pSocket = (CAsyncSocket*)
pState-> m_pmapDeadSockets-> GetValueAt((void*)hSocket);
if (pSocket != NULL)
return pSocket;
}
return NULL;
}
应该是在一个哈希表中查找其关联的窗口句柄...没找到?不是Create时就创建了吗?
不然OnConnect事件怎么触发了...?
这是MS的一个方案: http://support.microsoft.com/kb/139692/en-us
好像没作用..我按第三种...
麻烦看下,急用,谢谢
[解决办法]
汗。。。
[解决办法]
应楼主的要求前来接分...
看在我正在奔星的份上楼主就多施舍一些吧,阿弥陀佛..
[解决办法]
牛...你那么多分留着干嘛...一般到了一星差不多问的问题,基本上都没人能回答到点上的.除非你分是混来的,HEHE.