大家好~!
我遇到一个很奇怪的问题。
我在菜单上新建了一项并在view中给出点击她的处理函数,并在起处理函数中做了相应的操作(把最后的结果,写入磁盘文件)。运行发现。点击菜单时,系统报错。可是在处理函数的写文件操作正确完成。
单步调试后发现,在菜单的处理函数中都没有问题,可是在该函数被调用完后,发现程序回到了它的上层函数AFXAPI _AfxDispatchCmdMsg(),然后到上层函数CCmdTarget::OnCmdMsg(),然后到CView::OnCmdMsg(),然后到CFrameWnd::OnCmdMsg(),然后到CWnd::OnCommand(),然后到CWnd::OnWndMsg(),然后CWnd::WindowProc(),然后LRESULT AFXAPI AfxCallWndProc(),LRESULT CALLBACK AfxWndProc(),LRESULT CALLBACK AfxWndProcBase(),最后就进入一段汇编语言代码,然后走几步就出错了。
MY GOD,VC我也不是很精通,我还一直以为我只要负责编写菜单处理函数那一部分代码来着,其他的想消息的分发,不都是系统做的吗?可是现在这种情形,让我怎么调呀~~~~:(
大家有遇到过这样的情况吗?知道是怎么回事吗?
还有一个小问题,想菜单的处理函数是否一定要为void 类型呀,如果不是,比如改成int类型,是否会有意外发生呢?
thank you all in advance~!!

解决方案 »

  1.   

    void 类型不能改成int类型
    可以试一下啊,应该编译就不能通过。//我也没试菜单处理的代码贴出来看看呢
      

  2.   

    zhucde(【風間苍月】)(MVP),我按照你的建议,把处理函数的代码注释掉了,系统果真没有报错,可是我也查不出有什么地方资源没有释放掉,我把代码贴上来了。
    void CCV2View::OnBatch() 
    {
    WIN32_FIND_DATA FileData;   // Data structure describes the file found
    HANDLE hSearch;             // Search handle returned by FindFirstFile BOOL bFinished = FALSE;
    CWzdDirDlg dlg;
    char buf[MAX_PATH];
    _getcwd(buf,MAX_PATH);//获取当前工作文件夹
    CString dir=dlg.GetDirectory(this,buf,"选择:");
    TCHAR SearchFiles[255];
     _tcscpy(SearchFiles, dir);//dir为选择后的文件夹路径。
    lstrcat (SearchFiles, "\\*.*");
    hSearch = FindFirstFile (SearchFiles, &FileData);//找到当前路径下的第一个文件,并返回其句柄
    if (hSearch == INVALID_HANDLE_VALUE){return;}
    while (!bFinished)
    {
    TCHAR szReadPath[MAX_PATH];  
    _tcscpy(szReadPath, dir);//dir为选择后的文件夹路径。
    lstrcat(szReadPath, "\\");
    lstrcat (szReadPath, FileData.cFileName);
    //szReadPath为所要读的文件的完整路径。
                       CString filename=FileData.cFileName;
    IplImage* imga = cvLoadImage(szReadPath,1);
    //应该没有问题的,1表示是大于0的,是三通道的。
    if(imga){TextureProc(imga);}//对图象提取纹理特征。
    if (!FindNextFile (hSearch, &FileData))
    {
    bFinished = TRUE;
    if (GetLastError () == ERROR_NO_MORE_FILES)
    {
    //wsprintf (szMsg, TEXT("Found all of the files."));
    }
    else
    {
    //wsprintf (szMsg, TEXT("Unable to find next file."));
    }
    }
    }
    // Close the search handle.
        FindClose (hSearch);
    }
    因为我的程序调用了一个函数库,所以估计在别的人那里可能用不起来,大家就帮我看一下吧。不胜感谢~!
      

  3.   

    单步试一下
    /* CWzdDirDlg dlg;//F9 ... F5 ... F10看看问题出在哪里
    char buf[MAX_PATH];
    _getcwd(buf,MAX_PATH);//获取当前工作文件夹
    CString dir=dlg.GetDirectory(this,buf,"选择:");*/
    // IplImage* imga = cvLoadImage(szReadPath,1);
    //应该没有问题的,1表示是大于0的,是三通道的。
    // if(imga){TextureProc(imga);}//对图象提取纹理特征。
    //应该就是上面两个地方出错了
    其它在我这里没问题
      

  4.   

    你先把OnBatch()中的代码全部注释掉,看看还有没有问题,如果没有那么问题出在别的地方,如果还不行,你把代码发过来, 我帮你看看[email protected]
      

  5.   

    ymbymb(毛病大哥),我好感动哦~!太感谢你啦~!
    我的程序调用了一个图象处理的库OPENCV,所以,可能在你那里就运行不起来啦。
    但我还是发给你试试了,只能大概看看了,不过不能调就算了,也没有事,大不了,我就只能用另一种方法做啦,只不过这样的话,我的程序就要大调整了~~~:(
    再次,感谢大家的回复!!!
      

  6.   

    ymbymb(毛病大哥),
    没有收到我发给你的短信息吗?
    已经超过5M了,所以----------
    看来只有我自己来解决了~!
    thank you all the same~!