最近在写一个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;
}