VC++ Socket控件编程Debug出Release正常的问题解决日记

     最近在写一个Socket程序,是个文件传输的ActiveX放到网页里用的!我从原先一个成熟的Socket Client程序移植代码到ActiveX工程!原来的工程无论是Debug还是Release都没有任何异常!但是放到ActiveX项目里,出现问题了!

     Release状态编译以后,程序没问题,但是用Debug状态编译后,在执行sockClient.Create()语句时,出现afxwin1.inl 22行异常的

错误提示!找了很多资料,大都是废话一堆,不能一下击中要害!总算一个高手指点,要在函数最前面加一句话:

AFX_MANAGE_STATE(AfxGetStaticModuleState());

 

     如法炮制,问题解决!具体原理看了一下。不做累述,能解决问题就是好办法!贴出代码如下:

 

 

 

void CSocketSendFileDlg::OnSend()
{
 // TODO: Add your control notification handler code here
 DWORD dwThreadId;
 CreateThread(NULL,0,SendFileThread,this,0,&dwThreadId);  //新发起一个线程调用SendFileThread
}

 

 

//发送文件线程
DWORD WINAPI CSocketSendFileDlg::SendFileThread(LPVOID lpParam)
{
 //加以下语句可消除Debug时出现的afxwin1.inl的报错
 //该错误在Release时是不出现的
 AFX_MANAGE_STATE(AfxGetStaticModuleState()); //---在函数入口处加这句话就OK

 CSocketSendFileDlg *pDlg=(CSocketSendFileDlg *)lpParam;
  
 CSocket sockClient;
 
 //sockClient=pDlg->m_ClientSocket;
 
 sockClient.Create();
 
 CString ip,port;
  
 pDlg->m_strIP.GetWindowText(ip);
 pDlg->m_Port.GetWindowText(port);
 
 //GetDlgItemText(IDC_HOST,ip);
 //GetDlgItemText(IDC_PORT,port);
  
 int intRet=sockClient.Connect(ip, atoi(port));
 
 ///
 CFile myFile;
 FILEINFO myFileInfo;
 
 if(!myFile.Open(pDlg->m_strSendFile, CFile::modeRead | CFile::typeBinary))
  return -1;
 
 myFileInfo.fileLength=myFile.GetLength();  //得到文件大小
 
 strcpy(myFileInfo.fileName,myFile.GetFileName());//得到文件名称
 
 //pDlg->m_ClientSocket.Send(&myFileInfo,sizeof(myFileInfo)); //发送文件信息
 sockClient.Send(&myFileInfo,sizeof(myFileInfo)); //发送文件信息
 
 pDlg->m_CtrlProgressSend.SetRange32(0,myFileInfo.fileLength);
 
 myFile.Seek(0,CFile::begin);
 
 char m_buf[SIZEFILE]={0};
 CString strError;
 int num=0;
 int end=0;
 int temp=0;
 
 //pDlg->GetDlgItem(IDC_BUTTON_STOP_FILE)->EnableWindow(true);
 

 for(;;)
 {
  num=myFile.Read(m_buf, SIZEFILE);
  if(num==0) break;
  end=sockClient.Send(m_buf, num);
  //end=pDlg->m_ClientSocket.Send(m_buf, num);
  temp+=end;
  pDlg->m_CtrlProgressSend.SetPos(temp);
   
  if(pDlg->bolCancel)
  {
   //获取当前线程的Handle
   HANDLE pThread=GetCurrentThread();
   DWORD dw=0;
   TerminateThread(pThread,dw);
   break;    
  }

  if(end==SOCKET_ERROR)
  {
   AfxMessageBox("_SendFileThread Send错误!"+pDlg->GetError(GetLastError()));
   break;  
  }
 }
 pDlg->m_CtrlProgressSend.SetPos(0);
 
 CString strLocalName;
  
 if(temp==myFileInfo.fileLength)
 {
  //pDlg->AddMsgList(strLocalIP+"->"+strLocalName,"文件发送成功");
  AfxMessageBox("文件发送成功");
 }
 else
 {
  //pDlg->AddMsgList(strLocalIP+"->"+strLocalName,"文件发送失败");
  AfxMessageBox("文件发送失败");
 }
 
 myFile.Close();
 sockClient.Close();
 //pDlg.m_ClientSocket.Close();
 
 //pDlg->FileWork=false;
 //pDlg->GetDlgItem(IDC_PROGRESS_SEND_FILE)->ShowWindow(SW_HIDE);
 //pDlg->GetDlgItem(IDC_BUTTON_STOP_FILE)->EnableWindow(false);

 //pDlg->GetDlgItem(IDCANCEL)->EnableWindow(true);
 //pDlg->GetDlgItem(IDC_BUTTON_DISCONNECT)->EnableWindow(true);
 
 return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值