以下是正常可以处理的程序:
CFileDialog mFileDlg(true,NULL,NULL,OFN_ALLOWMULTISELECT,"All File(*.*)|*.*|BMP文件(*.BMP)|*.BMP",AfxGetMainWnd());
    CString buf(" ",10000);
    mFileDlg.m_ofn.lpstrFile = buf.GetBuffer(10000);
    mFileDlg.DoModal();
    MessageBox(mFileDlg.GetPathName());
    buf.ReleaseBuffer();
但如果改成这样的就会出错:
     CFileDialog mFileDlg(true,NULL,NULL,OFN_ALLOWMULTISELECT,"All File(*.*)|*.*|BMP文件(*.BMP)|*.BMP",AfxGetMainWnd());
    LPSTR buf = new char[10000];
    mFileDlg.m_ofn.lpstrFile = buf;
    mFileDlg.DoModal();
    MessageBox(mFileDlg.GetPathName());
    delete buf;该代码会在mFileDlg.DoModal();处出错。我就不明白,
同样都是需要给LPSTR类型的mFileDlg.m_ofn.lpstrFile传地址,又有相同的内存大小,为何第二种就不行呢?

解决方案 »

  1.   

    估计跟内存分配方式有关,MFC不是用new,你可以看看CString的实现,这也常会导致在模块之间传CString出错
      

  2.   

    lpstrFile 
    Long pointer to a buffer that contains a file name used to initialize the File Name edit control. The first character of this buffer must be NULL if initialization is not necessary. 
    他必须要初始化,不然会错的。
      

  3.   

    要赋初值的
    LPSTR buf = new char[10000];
    buf[0] = '\0';  
    要不是10000个字节的乱码
    mFileDlg.m_ofn.lpstrFile的范围是_MAX_FNAME//256
    多了会出错,
    delete buf;//最好是delete[] buf;
      

  4.   

    int 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); // 错在这里了,如果不初始化这个nOffset就很大,因为你new了10000那么大。
             ... ...
    }
      

  5.   

    你在LPSTR buf = new char[10000];这句后面加上memset(buf,0,10000);好了。或者buf[0]='\0';
    也不必要那么大,路径最大就是MAX_PATH 260.