只要不是用在多线程中,就不会报错
static DWORD WINAPI RecvZJThread(LPVOID lpParam)
{
SOCKET sock = *((SOCKET *)lpParam);
int rc = 0;
char szBuf[4096] = {0};
int iRep = 0;

TRACE("================进入RecvZJThread==================\n");
while(1)
{
memset(szBuf, 0x00, sizeof(szBuf));
rc=recv(sock,szBuf,sizeof(szBuf) - 1,0);
szBuf[4094]='\0';
CString strMsg("");
for(int i=0 ;i<rc;i++)
{
if (szBuf[i]!='\0')
{
strMsg +=szBuf[i];
}

}
TRACE(strMsg);
// AfxMessageBox(*pcTmp);
// TRACE(szBuf);
//memcpy(szMsg.GetBuffer(0),szBuf,rc); if(rc <= 0)
{
//CloseHandle(g_hRecvZJ);
//closesocket(sock);
//return 0;

else   {
CString szRes = ((CFrontCollectApp*)AfxGetApp())->g_pZJSendClient->DealWebDataFun(szBuf,rc);
CString strBuf;
strBuf.Format("%s",szBuf);
iRep = atoi(szRes);
if (szBuf[8] == 0x62)
{
if(atoi(szRes) == 0)
{
((CFrontCollectApp*)AfxGetApp())->m_iLoginFlag = 1;
TRACE("\n================收到中继登陆响应消息,成功==================\n");
CMainFrame *pWnd  = (CMainFrame*)::AfxGetApp()->GetMainWnd();
// pWnd->DisplayMsg("dfdfddfdf");

else 
{
((CFrontCollectApp*)AfxGetApp())->m_iLoginFlag = 0; TRACE("\n================收到中继登陆响应消息,失败==================\n");
} } 
else 
{
TRACE("\n ================收到中继采集响应消息              iRep=d==================\n", iRep);
CMainFrame *pWnd  = (CMainFrame*)::AfxGetApp()->GetMainWnd();
CFrontCollectView* pView = pWnd->GetDataView();
pView->m_pMsg22->ParseMsg(szBuf, rc);
pView->m_pMsg22->ParseMsgXML();
CString szChNo = pView->m_pMsg22->CHNL_NO;
pView->ReceiveResponse(szChNo,iRep, "");

}
}
} return 0;
}这里的分割用的是静态分割,具体是什么原因,请各位高手指教!谢谢!

解决方案 »

  1.   

    需要socket的初始化环境
    WSAInit
      

  2.   

    在线程中不要直接操作窗口指针,包括AfxGetApp。
    在线程中操作窗口指针很容易造成脏数据或者访问冲突而crash掉。
    如果需要操作的话,SendMessage发送一个消息到主线程,在窗口响应中处理,处理完毕后通过SendMessage返回值返回或者通过全局变量返回(当然最好不要通过全局变量)。
      

  3.   

    CMainFrame *pWnd = (CMainFrame*)::AfxGetApp()->GetMainWnd();
    把主窗体的指针用参数传
    我以前也有这种情况,后来改成SENDMESSAGE