首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

(急救) dll中使用CAsyncSocket,在FreeLibrary时,CAsyncSocket的Close出错?解决思路

2012-01-05 
(急救) dll中使用CAsyncSocket,在FreeLibrary时,CAsyncSocket的Close出错???dll为win32,动态链接到MFC库导

(急救) 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.

热点排行