[code = C\C++]
void CMyDialog::OnBnClickedButton1()
{//调用
  CFileDialog fileDlg(true);
  fileDlg.m_pOFN->lpstrFileFilter = "打开数据文件";
  if(fileDlg.DoModal() == IDOK)
  {}
}
[/code]
[code = C\C++]
_AfxActivationWndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam)
{//wincore中
  ...
  TRY
  {
    BOOL bCallDefault = TRUE;
    switch(nMsg)
    {
    case WM_INITDIALOG:
     {
      DWORD dwStyle;
      CRect rectOld;
      CWnd* pWnd = CWnd::FromHandle(hWnd);
      _AfxPreInitDialog(pWnd,&rectOld,&dwStyle);
      bCallDefault = FALSE;
      lResult = CallWindowProc(oldWndProc,hWnd,nMsg,wParam,lParam);//出错的地方
      _AfxPostInitDialog(pWnd,rectOld,dwStyle);
     }break;
     ...
    }
}
[/code]
请问这是什么原因造成的?

解决方案 »

  1.   

     
    void CMyDialog::OnBnClickedButton1() 
    {//调用 
      CFileDialog fileDlg(true); 
      fileDlg.m_pOFN->lpstrFileFilter = "打开数据文件"; 
      if(fileDlg.DoModal() == IDOK) 
      {} 

     
     
    _AfxActivationWndProc(HWND hWnd,UINT nMsg,WPARAM wParam,LPARAM lParam) 
    {//wincore中 
      ... 
      TRY 
      { 
        BOOL bCallDefault = TRUE; 
        switch(nMsg) 
        { 
        case WM_INITDIALOG: 
        { 
          DWORD dwStyle; 
          CRect rectOld; 
          CWnd* pWnd = CWnd::FromHandle(hWnd); 
          _AfxPreInitDialog(pWnd,&rectOld,&dwStyle); 
          bCallDefault = FALSE; 
          lResult = CallWindowProc(oldWndProc,hWnd,nMsg,wParam,lParam);//出错的地方 
          _AfxPostInitDialog(pWnd,rectOld,dwStyle); 
        }break; 
        ... 
        } 

      

  2.   

    在0x77f417e处未处理的异常:0xC00000005:写入位置0x0041ca20时发生访问冲突。
      

  3.   

    lpstrFileFilter 是文件类型,不是这么写的
    应该写成
    "Chart Files (*.xlc)|*.xlc|All Files (*.*)|*.*||"
      

  4.   

    那个我打错了,我给几条省了就写了那么一条:fileDlg.m_pOFN->lpstrTitle = "打开数据文件";
    现在错误貌似是fileDlg中OnInitDialog有冲突
      

  5.   

    首先是在菜单中打开对话框:void CMyappApp::On32777()
    {
      CMyDialog MyDlg;
      MyDlg.DoModal();
    }//class CMyDialog :public CDialog
    //对话框中有个button
    void CMyDialog::OnBnClickedButton1() 
    {//调用 
      CFileDialog fileDlg(true); 
      fileDlg.m_pOFN->lpstrTitle = "打开数据文件"; 
      if(fileDlg.DoModal() == IDOK) 
      {} 
    }
      

  6.   

    fileDlg.m_pOFN->lpstrFile = "打开数据文件"要 全名 试一下
      

  7.   

    我试了简单创建的对话框,设置按钮调用CFileDialog对象的DoModal()都会出这个错误,直接扔在Menu里面调用就正常,不会出错。
    也就是我现在自己创建的对话框调用comm dialog有问题,不知道其中是不是有什么需要设置的地方没设置好。或者是需要非模态对话框才能调用模态对话框?
    单步调试到Wincore.cpp里面,到出错的地方给一个绿箭头移到上面提示“此代码调用了另一个函数。当该函数完成后,这是将要执行的下一条语句。”
    也就是2楼发的第二段代码出错的地方。我用的是vs.net2003。
      

  8.   

    直接扔在Menu里面是什么意思?你这个程序是MDI还是对话框的?Win32程序?看1楼的程序代码我都晕了,既像MFC的,又像Win32的
      

  9.   

    创建的时候是单文档的MFC应用程序,菜单里弄个事件调用CFileDialog对象能成功。但是菜单里先调用我创建的对话框,由对话框里的按钮调用CFileDialog对象,能编译生成exe文件,执行的时候点击按钮调用CFileDialog对象就直接程序崩溃。单步调试运行到Wincore(如1楼的第二段代码)中的
    lResult = CallWindowProc(oldWndProc,hWnd,nMsg,wParam,lParam);//出错的地方
    提示的错误是“myApp.exe在0x77f417e处未处理的异常:0xC00000005:写入位置0x0041ca20时发生访问冲突。”
    从单步到运行的地方个人感觉是CFileDialog对象发消息WM_INITDIALOG,但是某个函数被其他函数调用未结束,不能为这个CFileDialog对象进行初始化,导致程序出错,崩溃掉了。这是一个MFC程序,这里想问一下,对话框调用CFileDialog需要有什么特别的初始化吗,或者跟模态和非模态有关?
      

  10.   

    用这个试试,我在对话框里打开文件的函数,可以打开一个或多个文件CStringArray  *CWavCatDlg::GetFiles()
    {
    OPENFILENAME   ofn;   
    ZeroMemory(&ofn,   sizeof(ofn));   
    ofn.lStructSize   =   sizeof(OPENFILENAME);   
    ofn.hwndOwner   =   GetSafeHwnd();   
    ofn.lpstrFile   =   new   TCHAR[MAX_PATH   *   500];   
    ofn.nMaxFile   =   MAX_PATH   *   500;   
    ZeroMemory(ofn.lpstrFile,   ofn.nMaxFile   *   sizeof(TCHAR));   
    ofn.lpstrFilter   =   _T("WAV  Files(*.wav)\0*.wav\0\0");
    ofn.nFilterIndex   =   0;   
    ofn.lpstrFileTitle   =   NULL;   
    ofn.nMaxFileTitle   =   0;   
    ofn.lpstrInitialDir   =   NULL;   
    ofn.Flags   =   OFN_PATHMUSTEXIST   |   OFN_FILEMUSTEXIST   |  
    OFN_ALLOWMULTISELECT   |   OFN_EXPLORER   |   OFN_HIDEREADONLY;    //   Display   the   Open   dialog   box.     

    if   (GetOpenFileName(&ofn))     
    {   
    LPCTSTR   lpFile   =   ofn.lpstrFile;   
    if   (lpFile[lstrlen(lpFile)   +   1]   ==   0)//one   file   
    {   
    arFiles.Add(lpFile);   
    }   
    else   
    {   
    lpFile   +=   lstrlen(lpFile)   +   1;//first   file   
    while(lpFile[0]   !=   0)   
    {   
    CString   strFilePath(ofn.lpstrFile);   
    strFilePath.TrimRight('\\');   
    strFilePath   +=   CString("\\")   +   lpFile;    arFiles.Add(strFilePath);    lpFile   +=   lstrlen(lpFile)   +   1;//Next   file   
    }   
    }   
    delete[]   ofn.lpstrFile;
    return &arFiles;
    }   
    delete[]   ofn.lpstrFile;
    return NULL;}
      

  11.   

    应该是 m_ofn 。
    另外,如果是通过 m_ofn.lpstrFilter = XXX 这种赋值方式,
    后面的字符串应该使用 \0 分割,最后使用两个 \0 结束。
      

  12.   

    我换装了vs2008的机器对话框中使用打开文件对话框是可以的,没有错误。可能vs2003这里面有bug。
    15楼的方法可以实现打开对话框的正常打开,看来vs2003里对话框调用 打开文件对话框 只能不用通用的CFileDialog了。
    结贴了,谢谢楼上各位。各位费心了。