调试到 DoModal时跳开了

高分子 2014-08-16 10:49:59
在WSAAsyncSelect所触发的事件 的FD_READ中
有下面一段程序,为什么在调试时执行到nResponse=fileDlg.DoModal()时,根本未执行fileDlg.DoModal(保存窗口未打开,nResponse未被赋值),就回跳到SOCKET socket=(SOCKET)wParam这一步,花了老多时间,还是没有找到问题
LRESULT CPro_mfccsDlg::OnNETWORKFILE(WPARAM wParam,LPARAM lParam)
{
SOCKET socket=(SOCKET)wParam;
int nResponse;

if (HIWORD(lParam))
{
::closesocket(socket);
return 0;
}
else
{
switch(LOWORD(lParam))
{
case FD_ACCEPT:
{
SOCKET socket_file_client=accept(socket,NULL,NULL);
if (socket_file_client!=INVALID_SOCKET)
{


CFileDialog fileDlg(FALSE); //构造一个文件另存为对话框
fileDlg.m_ofn.lpstrTitle=_T("保存为");
fileDlg.m_ofn.lpstrFilter=_T("Text Files(*.txt)\0*.txt\0ALL Files(*.*)\0*.*\0\0");
fileDlg.m_ofn.lpstrDefExt=_T("txt"); //定义缺省文件扩展名
nResponse=fileDlg.DoModal();
if(nResponse==IDOK) //打开文件另存为对话框
{....}
...全文
392 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2014-08-22
  • 打赏
  • 举报
回复
"在此处发现监视变量m_ofn,发现 报 CXX0017:错误:没有找到符号"m_ofn" 那是微软的代码,保密的.
高分子 2014-08-22
  • 打赏
  • 举报
回复
在上面代码nResponse=fileDlg.DoModal() debug 跟进去 跟到dlgfile.cpp中下面代码里 INT_PTR CFileDialog::DoModal() { ASSERT_VALID(this); ASSERT(m_ofn.Flags & OFN_ENABLEHOOK); ASSERT(m_ofn.lpfnHook != NULL); // can still be a user hook // zero out the file buffer for consistent parsing later ASSERT(AfxIsValidAddress(m_ofn.lpstrFile, m_ofn.nMaxFile)); DWORD nOffset = lstrlen(m_ofn.lpstrFile)+1; ASSERT(nOffset <= m_ofn.nMaxFile); memset(m_ofn.lpstrFile+nOffset, 0, (m_ofn.nMaxFile-nOffset)*sizeof(TCHAR)); // This is a special case for the file open/save dialog, // which sometimes pumps while it is coming up but before it has // disabled the main window. HWND hWndFocus = ::GetFocus(); BOOL bEnableParent = FALSE; m_ofn.hwndOwner = PreModal(); AfxUnhookWindowCreate(); if (m_ofn.hwndOwner != NULL && ::IsWindowEnabled(m_ofn.hwndOwner)) { bEnableParent = TRUE; ::EnableWindow(m_ofn.hwndOwner, FALSE); } _AFX_THREAD_STATE* pThreadState = AfxGetThreadState(); ASSERT(pThreadState->m_pAlternateWndInit == NULL); if (m_bVistaStyle == TRUE) { AfxHookWindowCreate(this); } else if (m_ofn.Flags & OFN_EXPLORER) pThreadState->m_pAlternateWndInit = this; else AfxHookWindowCreate(this); INT_PTR nResult = 0; if (m_bVistaStyle == TRUE) { ApplyOFNToShellDialog(); HRESULT hr = (static_cast<IFileDialog*>(m_pIFileDialog))->Show(m_ofn.hwndOwner); nResult = (hr == S_OK) ? IDOK : IDCANCEL; } else if (m_bOpenFileDialog) nResult = ::AfxCtxGetOpenFileName(&m_ofn); else nResult = ::AfxCtxGetSaveFileName(&m_ofn); 在此处发现监视变量m_ofn,发现 报 CXX0017:错误:没有找到符号"m_ofn" 这个是mfc的类库构成文件,忘了说了一点,这个工程是从VC6转到VS2008的
高分子 2014-08-19
  • 打赏
  • 举报
回复
在未调试和启动调试后,都没能在Edit菜单中找到debug相关东东
赵4老师 2014-08-18
  • 打赏
  • 举报
回复
Setting a Breakpoint on a Message Received by a Windows Function You can set message breakpoints to stop the debugger when a particular WndProc function message is received. Note Message breakpoints work only on x86- or Pentium-based systems. To set a breakpoint on a message From the Edit menu, click Breakpoints. The Breakpoints dialog box appears. Click the Messages tab. In the Break At WndProc text box, type the name of the Windows function. If you are setting a breakpoint during a debug session, the list contains the exported functions in your project. In the Set One Breakpoint For Each Message To Watch list box, select the message. To set another breakpoint, press ENTER, and then repeat steps 3 and 4. The Breakpoints list displays the currently active breakpoints. Click OK to set the breakpoints. Note If you interrupt execution while Windows or other system code is running, the results can be unpredictable.
高分子 2014-08-17
  • 打赏
  • 举报
回复
自己顶一下哟,高手们,来吧
高分子 2014-08-16
  • 打赏
  • 举报
回复
void CPro_mfccsDlg::OnButtonListen() { // TODO: Add your control notification handler code here sockSrv=socket(AF_INET,SOCK_STREAM,0); if (sockSrv==INVALID_SOCKET) {MessageBox(CString(_T("创建套接字出错")),MB_OK);return;} addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSrv.sin_family=AF_INET; addrSrv.sin_port=htons(6000); err=bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR)); err=listen(sockSrv,5); if (err==SOCKET_ERROR) { int err_listen; err_listen=WSAGetLastError(); char *szSockerr=""; sprintf_s(szSockerr,200,"%d",err_listen); MessageBox(CString("create listen error,errorcode is")+CString(szSockerr),MB_OK); return; } GetDlgItem(IDC_STATIC_LIS_TS)->SetWindowText(_T("成功启动本地服务器(消息方式)")); sockSrvFile=socket(AF_INET,SOCK_STREAM,0); if (sockSrvFile==INVALID_SOCKET) {MessageBox(CString(_T("创建文件套接字出错")),MB_OK); return;} addrSrvFile.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addrSrvFile.sin_family=AF_INET; addrSrvFile.sin_port=htons(6006); err=bind(sockSrvFile,(SOCKADDR*)&addrSrvFile,sizeof(addrSrvFile)); if(err==SOCKET_ERROR) { int err_listen; err_listen=WSAGetLastError(); sprintf_s(szSockerr,200,"%d",err_listen); MessageBox(CString("绑定出错,error code is")+CString(szSockerr),MB_OK); return; } err=listen(sockSrvFile,5); if(err==SOCKET_ERROR) { int err_listen; err_listen=WSAGetLastError(); memset(szSockerr,0,200); sprintf_s(szSockerr,200,"%d",err_listen); MessageBox(CString("create listen error,error code is")+CString(szSockerr),MB_OK); return; } GetDlgItem(IDC_STATIC_LIS_TS)->SetWindowText(_T("成功启动本地服务器(消息/文件传输方式)")); WSAAsyncSelect(sockSrv, this->m_hWnd, WM_CUSTOM_NETWORK_MSG, FD_ACCEPT | FD_CLOSE); WSAAsyncSelect(sockSrvFile, this->m_hWnd, WM_CUSTOM_NETWORK_FILE, FD_ACCEPT | FD_CLOSE); }
高分子 2014-08-16
  • 打赏
  • 举报
回复
LRESULT CPro_mfccsDlg::OnNETWORKFILE(WPARAM wParam,LPARAM lParam) //要传文件名的 { SOCKET socket=(SOCKET)wParam; int nResponse; if (HIWORD(lParam)) { ::closesocket(socket); return 0; } else { switch(LOWORD(lParam)) { case FD_ACCEPT: { SOCKET socket_file_client=accept(socket,NULL,NULL); if (socket_file_client!=INVALID_SOCKET) { //AFX_MANAGE_STATE(AfxGetStaticModuleState()); CFileDialog fileDlg(FALSE); //构造一个文件另存为对话框 fileDlg.m_ofn.lpstrTitle=_T("保存为"); fileDlg.m_ofn.lpstrFilter=_T("Text Files(*.txt)\0*.txt\0ALL Files(*.*)\0*.*\0\0"); fileDlg.m_ofn.lpstrDefExt=_T("txt"); //定义缺省文件扩展名 nResponse=fileDlg.DoModal(); if(nResponse==IDOK) //打开文件另存为对话框 { CString sPathName; sPathName=fileDlg.GetPathName(); int rtn; CFileException pError; rtn=cfile_send.Open(sPathName,CFile::modeWrite|CFile::modeCreate,&pError); //以写的方式创建新文件 CFile::modeCreate| if (!rtn) { //TRACE(_T("File could not be opened %d\n"), e.m_cause); CString cstr_err; cstr_err.Format("%d",pError.OsErrorToException); MessageBox(CString("打开文件出错,错误代码为")+cstr_err); } //file.Write("LinuxLan",strlen("LinuxLan")); //往文件写入数据 //file.Close(); WSAAsyncSelect(socket_file_client,m_hWnd,WM_CUSTOM_NETWORK_FILE,FD_READ|FD_WRITE|FD_CLOSE); } } break; } case FD_READ: { char szBuffer[MAX_PATH]={0}; //接收文件的保存路径 if (recv(socket,szBuffer,MAX_PATH,0)>0) {//要修改,仿前面消息传送,要写文件 //============================ cfile_send.Write(szBuffer,sizeof(szBuffer)); //=========================================== } break; } case FD_CLOSE: { closesocket(socket); break; } } } }
叶恭介叶恭介 2014-08-16
  • 打赏
  • 举报
回复
发工程给我看看吧
高分子 2014-08-16
  • 打赏
  • 举报
回复
是不是CFileDialog类对象不能放在WSAAsyncSelect触发的事件中,嘿
高分子 2014-08-16
  • 打赏
  • 举报
回复
引用 6 楼 schlafenhamster 的回复:
程序结构应该是: DoModal() 只要一次!
只要一次,CFileDialog类窗口还没显示呀,哥,也没有执行DoModal呀,怎么变成只要一次
schlafenhamster 2014-08-16
  • 打赏
  • 举报
回复
程序结构应该是: DoModal() 只要一次!
阿呆_ 2014-08-16
  • 打赏
  • 举报
回复
DoModal()中有消息循环,又开始从消息队列中拉消息来dispatch, 所以又触发了另一个你的OnNETWORKFILE
高分子 2014-08-16
  • 打赏
  • 举报
回复
自己顶一下吧
高分子 2014-08-16
  • 打赏
  • 举报
回复
重新生成过好多次,都不行; 另一个客户端在6001端口上发送文件,这边也在6001接收文件, 接收时触发WSAAsyncSelect函数,接下来, 这个只是在WSAAsyncSelect中的FD_ACCEPT中打开CFileDialog类对象, 但就是不执行到DoModal,又跳上去了
向立天 2014-08-16
  • 打赏
  • 举报
回复
是不是又有消息过来了
叶恭介叶恭介 2014-08-16
  • 打赏
  • 举报
回复
建议通过加多几个TRACE输入字符来判断是否有到下一步。 建议关闭所有文件,重新生成一下工程

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧