psycheqiqi 发表于 2009-10-15 10:04:16

release版本出错

问题:在release下
1:客户端给服务器发送消息、文件名、文件内容都是可以的
2:服务器给客户端发送消息可以,但在发送文件名时,能发过去,但在函数void CPserverDlg::OnFileSelect()退出的时候(即我在点服务器端弹出的对话框时)会出现内存不能写的错误
3:服务器和客户端的发送时的区别在于我在服务器端用一个LIST来记录连接的客户端,但应该不是LIST的问题,因为可以发送消息。
4:最大的困惑在于:为什么客户端的功能没问题,但服务器端不行,而且是部分不行。

代码如下:
客户端:
void CPclientDlg::OnSend()
{
// TODO: Add your control notification handler code here
CString str;
m_send->GetWindowText(str);
if(str==_T(""))
{
MessageBox("信息不能为空!");
return ;
}
str += '@';
char * s = (char *)(LPCTSTR)str;
HA_Proactive_Service *curSvr = HA_Proactive_Service::GetObj();
    curSvr->WriteDate(s,strlen(s));
}
void CPclientDlg::OnFileSelect()
{
// TODO: Add your control notification handler code here
CFileDialog fileDlg (TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,NULL,this);
if(fileDlg.DoModal() != IDOK )
{
MessageBox("请选择传输的文件");
return;
}
else
{
sendFileName = fileDlg.GetFileName();//获得文件的名称
sendFileName += '$';

HA_Proactive_Service *curSvr = HA_Proactive_Service::GetObj();
curSvr->WriteDate((char *)(LPCTSTR)sendFileName,strlen(sendFileName));
sendFileName.Remove('$');
   MessageBox(sendFileName);
}

}
服务器:
void CPserverDlg::OnSend()
{
// TODO: Add your control notification handler code here
CString str;
m_send->GetWindowText(str);
if(str==_T(""))
{
MessageBox("信息不能为空!");
return ;
}
str += '@';
char * s = (char *)(LPCTSTR)str;
list <HA_Proactive_Service *> ::iterator its;
for(its=HA_Proactive_Service::List.begin();its!=HA_Proactive_Service::List.end();its++)
{
HA_Proactive_Service *curSvr = *its;
curSvr->WriteDate(s,strlen(s));
}
/* for(;i<num;i++)
{   
HA_Proactive_Service *curSvr = HA_Proactive_Service::GetObj();
curSvr->WriteDate(s,strlen(s));
}
i=0;
*/
}
void CPserverDlg::OnFileSelect()
{
// TODO: Add your control notification handler code here
CFileDialog fileDlg (TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,NULL,this);
if(fileDlg.DoModal() != IDOK )
{
MessageBox("请选择传输的文件");
return;
}
else
{
sendFileName = fileDlg.GetFileName();//获得文件的名称
sendFileName += '$';
char *s=(char *)(LPCTSTR)sendFileName;
list <HA_Proactive_Service *> ::iterator its;
for(its=HA_Proactive_Service::List.begin();its!=HA_Proactive_Service::List.end();its++)
{
   HA_Proactive_Service *curSvr = *its;
   curSvr->WriteDate(s,strlen(s));
}
sendFileName.Remove('$');
   MessageBox(sendFileName);
}
}

int WriteDate(char *szSendBuf, int nSendCnt)
{
ACE_Message_Block *smb = new ACE_Message_Block(nSendCnt+1);
smb->copy(szSendBuf,nSendCnt+1);      
int nResult = this->writer_.write(*smb,nSendCnt+1);
if ( nResult != 0)
{
   ACE_TRACE("Write data failed!");
}

return nResult;
}

psycheqiqi 发表于 2009-10-15 10:26:53

在void CPserverDlg::OnFileSelect() 里只写了
CFileDialog fileDlg (TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,NULL,this);
发现函数退出的时候就出错。
........................

psycheqiqi 发表于 2009-10-15 10:37:36

回复 #2 psycheqiqi 的帖子

找到原因了。
我在server端加了
//for use TryEnterCriticalSection
#ifndef _WIN32_WINNT
# define _WIN32_WINNT 0x0500
#endif

把0x0500改成0x0400就好了
原因以后补上
页: [1]
查看完整版本: release版本出错