自己写了一个程序调用GetOpenFileName,发现总是莫名其妙地导致程序突然消失,百思不得其解,于是看了《Windows程序设计(第五版)》第13章的PopPad例子程序,发现也有相同的问题,下面是一个可以必现的bug  运行PopPad程序-》File-》Open-》把鼠标悬浮在一个文件上直到出现tips-》点取消按钮-》File-》Open-》把鼠标悬浮在一个文件上直到出现tips-------》整个程序消失谁知道这是怎么回事,怎么改正,望高手指教。

解决方案 »

  1.   

    就连纪事本都有这个问题,我在桌面上建txt文件来试验过
    调试发现是Shell32里面的问题,Access Violation. 似乎是某个对象被提前释放了.
      

  2.   

    那怎么办啊,我发现有些应用程序的这个open对话框就没这个问题,他们是怎么实现的呢?
      

  3.   

    google "GetOpenFileName access violation"
      

  4.   

    看看GetOpenFileNameEx是否有问题,或改用之。
      

  5.   

    google了一下,还是没有找到解决办法啊dyw(道不同不相为谋) ( )
    也没有GetOpenFileNameEx这个函数啊
      

  6.   

    [code]
    int NAMEBUF=10000; CFileDialog m_filedialog(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT,"All Files (*.*)|*.*||",AfxGetMainWnd());
    m_filedialog.m_ofn.lpstrFile=new TCHAR[NAMEBUF];   // 重新定义 lpstrFile 缓冲大小
    memset(m_filedialog.m_ofn.lpstrFile,0,NAMEBUF);  // 初始化定义的缓冲 
    m_filedialog.m_ofn.nMaxFile = NAMEBUF;           // 重定义 nMaxFile 
    if(m_filedialog.DoModal()==IDOK) 
    {
    //得到选择文件的路径pathname
    m_Path_Name=m_filedialog.GetPathName();

    //遍历得到所有选择文件的路径
    POSITION pos=m_filedialog.GetStartPosition();
    while (pos!=NULL) 
    {
    m_All_File_Number++;
    m_All_File_Name=m_All_File_Name+m_filedialog.GetNextPathName(pos)+"|";
    }
    }
    delete [] m_filedialog.m_ofn.lpstrFile;             // 切记使用完后释放资源
    [/code]
      

  7.   

    http://support.microsoft.com/kb/909486/en-us
    看看,可能对你有用.
      

  8.   

    try to derive your own class from CFileDialog and disable the OnMouseHover messages.
      

  9.   

    该问题可以解决,参考:
    http://blog.csdn.net/dyw/archive/2007/09/02/1768857.aspx