VC ++ 2010:“显示打开"对话框挂起 [英] VC++ 2010: Show open dialog hangs

查看:306
本文介绍了VC ++ 2010:“显示打开"对话框挂起的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



从VC ++ 6迁移到VC2010后出现问题.应用程序已编译,但是当我单击打开"以使用覆盖的文件打开文件时,CDialog类对话框在加载一半后挂起.我不是一名优秀的C ++开发人员,因此很难找到上一个问题.

挂起时,立即窗口仅返回此错误:
"AliEditor.exe中0x006c69cc处的首次机会异常:0xC0000005:访问冲突读取位置0x00000020."

主窗体代码调用打开对话框":

Hi,

I am having issue after migrated from VC++ 6 to VC2010. Application is compiled but when I click open to open File using overriden CDialog class dialog hangs after loading halfway. I am not good C++ developer so having difficulty to find last issue.

Immediate window returns only this error when hangs:
"First-chance exception at 0x006c69cc in AliEditor.exe: 0xC0000005: Access violation reading location 0x00000020."

Main Form code calling Open Dialog:

void CMainFrame::OnFileOpen() 
{
	static TCHAR BASED_CODE szFilter[] = _T("Open Bin File(*.abs)|")
		   _T("Default DataBase File(*.ddf)|")
		   _T("SatCodex File(*.sdx)|")
		   _T("Format Text File(*.txt)");

	// TODO: Add your command handler code here
	CFileDlg fd(TRUE, "*.abs", "", OFN_HIDEREADONLY, szFilter, GetForegroundWindow() ); // | OFN_OVERWRITEPROMPT
		//"Open Bin File(*.abs)|Default DataBase File(*.ddf)|SatCodex File(*.sdx)|Format Text File(*.txt)");
	
	const int c_cMaxFiles = 1;
	const int c_cbBuffSize = (c_cMaxFiles * (MAX_PATH + 1)) + 1;
	fd.GetOFN().lpstrFile = m_strFilePathName.GetBuffer(c_cbBuffSize);
	fd.GetOFN().nMaxFile = c_cbBuffSize;

//Hangs inside this call
	if(fd.DoModal() != IDOK) return;
......
}





文件FileDlg.h标头:





File FileDlg.h header:

#if !defined(AFX_FILEDLG_H__8C927F99_3840_4A93_9E17_E153C675F9D4__INCLUDED_)
#define AFX_FILEDLG_H__8C927F99_3840_4A93_9E17_E153C675F9D4__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// FileDlg.h : header file
//
#include "FileExportDialog.h"

/////////////////////////////////////////////////////////////////////////////
// CFileDlg dialog

class CFileDlg : public CFileExportDialog
{
	DECLARE_DYNAMIC(CFileDlg)

public:
	CFileDlg(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs
		LPCTSTR lpszDefExt = NULL,
		LPCTSTR lpszFileName = NULL,
		DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		LPCTSTR lpszFilter = NULL,
		CWnd* pParentWnd = NULL);

protected:
	//{{AFX_MSG(CFileDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_FILEDLG_H__8C927F99_3840_4A93_9E17_E153C675F9D4__INCLUDED_)



文件FileDlg.cpp代码(初始化对话框):



File FileDlg.cpp code (initialising dialog):

// FileDlg.cpp : implementation file
//

#include "stdafx.h"
#include "AliEditor.h"
#include "FileDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CFileDlg

IMPLEMENT_DYNAMIC(CFileDlg, CFileDialog)

CFileDlg::CFileDlg(BOOL bOpenFileDialog, LPCTSTR lpszDefExt, LPCTSTR lpszFileName,
		DWORD dwFlags, LPCTSTR lpszFilter, CWnd* pParentWnd) :
		CFileExportDialog(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd)
{
}


BEGIN_MESSAGE_MAP(CFileDlg, CFileExportDialog)
	//{{AFX_MSG_MAP(CFileDlg)
	ON_WM_CLOSE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()






上面的代码调用的FileExportDialog.cpp文件中的其他初始化部分:






Other initialization part in FileExportDialog.cpp file called by code above:

//****************************************************************************
// N O L D U S   I N F O R M A T I O N   T E C H N O L O G Y   B . V .
//****************************************************************************
// Filename:      CFileExportDialog.cpp
// Project:       EthoVision
// Module:        Visualization
// Programmer:    Anneke Sicherer-Roetman
// Version:       1.00
// Revision Date: 22-03-1999
//****************************************************************************
// Description:   Definition of class CFileExportDialog
//                See CFileExportDialog.h
//****************************************************************************
// Revision history:
// 22-03-1999 - First implementation
//****************************************************************************
// Bugs: ........
//****************************************************************************
// @doc
//****************************************************************************

#include "stdafx.h"
#include <dlgs.h>
#include "FileExportDialog.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

// helper functions, defined at end
int Split(char *str,char *word[],int max,char c);
char *newdup(const char *str);

IMPLEMENT_DYNAMIC(CFileExportDialog, FILEEXPORTDIALOG_BASECLASS)

//****************************************************************************
// Function CFileExportDialog::CFileExportDialog
// @mfunc   constructor, creates dialog title and filter buffers
// @parm    const CString | &title      | dialog title
// @parm    const CString | &filter     | file filter<nl>
//          The filter MUST be of the form "Word File (*.doc)\|Text File (*.txt)"<nl>
//          .i.e one extension per format and the formats separated by pipes.
// @parm    const CString | &fileName   | initial filename (default "")<nl>
//          The initial filetype is determined from this filename if given.
// @xref    <c CFileExportDialog>
//****************************************************************************
// @prog 
// Anneke Sicherer-Roetman
// @revs 
// 22-03-1999 - First implementation
//****************************************************************************
// @todo 
//****************************************************************************
CFileExportDialog::CFileExportDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs
		LPCTSTR lpszDefExt,
		LPCTSTR lpszFileName,
		DWORD dwFlags,
		LPCTSTR lpszFilter,
		CWnd* pParentWnd) :
		base(bOpenFileDialog, lpszDefExt, lpszFileName, dwFlags, lpszFilter, pParentWnd),
      // if filter is "" (not NULL), an extension is added automatically!
      m_pTitleBuffer(NULL),
      m_pFilterBuffer(NULL),
      m_pFileBuffer(NULL),
      m_CurrentFilterIndex(1)
{
  // set dialog title
 // m_pTitleBuffer = newdup(title);
 // m_ofn.lpstrTitle = m_pTitleBuffer;
  CString filter(lpszFilter);
  CString fileName(lpszFileName);

  // construct filter string for standard file open dialog
  char *tempBuffer = newdup(filter);
  char *word[40]; // maximum of 40 file types
  // split original filter string on pipes
  int n = Split(tempBuffer,word,20,'|');
  char **fptr = new char *[n]; // note: pointers into tempBuffer
  // create new filter string
  m_pFilterBuffer = new char[filter.GetLength()+n*8+1];
  m_pFilterBuffer[0]='\0';
  // fill new filter string
  for (int i = 0; i < n; ++i) {
    // copy format description and add pipe
    strcat(m_pFilterBuffer,word[i]);
    strcat(m_pFilterBuffer,"|");
    // extract filter from format description
    char *part1[2]; 
	int m = Split(word[i],part1,2,'(');
    ASSERT(m == 2);
    char *part2[2]; 
	m = Split(part1[1],part2,2,')');
    ASSERT((m == 1 || m == 2) && !strncmp(part2[0],"*.",2));
    // add filter and add pipe
    strcat(m_pFilterBuffer,part2[0]);
    strcat(m_pFilterBuffer,"|");
    // remember filter for later usage
    fptr[i] = part2[0]+1;
  }
  // replace pipes by nul characters
  int l = strlen(m_pFilterBuffer);
  for (int i = 0; i < l; ++i)
    if (m_pFilterBuffer[i] == '|')
      m_pFilterBuffer[i] = '\0';
  // set filter string
  m_ofn.lpstrFilter = m_pFilterBuffer;

  // set default filename in dialog
  m_pFileBuffer = new char[256];
  m_ofn.lpstrFile = m_pFileBuffer;
  m_ofn.nMaxFile = 256;
  if (fileName.IsEmpty()) {
    sprintf(m_pFileBuffer, "*%s",fptr[0]);
  } else {
    strcpy(m_pFileBuffer, fileName);
  }

  // set filter index from default filename
  m_ofn.nFilterIndex = m_CurrentFilterIndex = 1;
  if (fileName.IsEmpty()) {

  } else {
    const char *ext = strchr(LPCSTR(fileName),'.');
    if (ext) {
      for (int i = 0; i < n; ++i)
        if (!strcmp(ext, fptr[i])) {
          m_ofn.nFilterIndex = m_CurrentFilterIndex = i + 1; 
          break;
        }
    }
  }

  // free temporary buffers
  delete tempBuffer;
  delete [] fptr;
}
....






FileExportDialog.h的头文件:






Header file of FileExportDialog.h:

//****************************************************************************
// N O L D U S   I N F O R M A T I O N   T E C H N O L O G Y   B . V .
//****************************************************************************
// Filename:      CFileExportDialog.h
// Project:       EthoVision
// Module:        Visualization
// Programmer:    Anneke Sicherer-Roetman
// Version:       1.00
// Revision Date: 22-03-1999
//****************************************************************************
// Description:   Declaration of class CFileExportDialog
//****************************************************************************
// Revision history:
// 22-03-1999 - First implementation
//****************************************************************************
// Bugs: ........
//****************************************************************************
// @doc
//****************************************************************************
#if !defined(AFX_NCFileExportDialog_H__BAABDC84_DDDA_11D2_A614_0060085FE616__INCLUDED_)
#define AFX_NCFileExportDialog_H__BAABDC84_DDDA_11D2_A614_0060085FE616__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

//****************************************************************************
// @class         CFileExportDialog |
//                File save dialog with automatic change of extension<nl>
//                This dialog changes the extension in the filename field
//                in concert with the chosen file type.<nl>
//                The initial filetype is determined from the default filename, if given.<nl>
//                Otherwise the first filetype in the filter string is used.
// @base          public | CFileDialog
//****************************************************************************
// @ex
// This shows how to call the export dialog from your application: |
//
// CFileExportDialog dialog("Export graphics file", 
//   "Windows Bitmap (*.bmp)|JPEG Compressed Image (*.jpg)","visualization.jpg");
//
// if (dialog.DoModal() == IDOK) {
//   CString filename = dialog.GetPathName();
//   int filetype = dialog.GetFilterIndex();
//   SaveFile(filename, filetype);
// }
//****************************************************************************
// @prog 
// Anneke Sicherer-Roetman
// @revs 
// 22-03-1999 - First implementation
//****************************************************************************
// @todo 
//****************************************************************************
#define FILEEXPORTDIALOG_BASECLASS CFileDialog

class CFileExportDialog : public FILEEXPORTDIALOG_BASECLASS
{
  typedef FILEEXPORTDIALOG_BASECLASS base;

	DECLARE_DYNAMIC(CFileExportDialog)

  // @access Public Member Functions and Variables
public:

  // @cmember
  // constructor, creates dialog title and filter buffers
  CFileExportDialog(BOOL bOpenFileDialog, // TRUE for FileOpen, FALSE for FileSaveAs
		LPCTSTR lpszDefExt = NULL,
		LPCTSTR lpszFileName = NULL,
		DWORD dwFlags = OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
		LPCTSTR lpszFilter = NULL,
		CWnd* pParentWnd = NULL);

  // @cmember
  // destructor, destroys dialog title and filter buffers
  virtual ~CFileExportDialog();

  // @cmember,mfunc
  // return current filter index (useful if two file formats have same extension)
  int GetFilterIndex() const { return m_CurrentFilterIndex; }

  // @access Protected Member Functions and Variables
protected:

  // @cmember
  // called when user selects other filetype, changes extension
  virtual void OnTypeChange();

  //{{AFX_MSG(CFileExportDialog)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()

  // @access Private Member Functions and Variables
private:

  char *m_pTitleBuffer;      // @cmember contains title string
  char *m_pFilterBuffer;     // @cmember contains filter string
  char *m_pFileBuffer;       // @cmember contains filename string
  int m_CurrentFilterIndex;  // @cmember current file type
};

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_NCFileExportDialog_H__BAABDC84_DDDA_11D2_A614_0060085FE616__INCLUDED_)






然后进入"dlgfile.cpp"文件的DoModal()并挂在这里:






Then goes into DoModal() of "dlgfile.cpp" file and hangs here:

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();


// HERE CALLS **OPENFILENAME& CFileDialog::GetOFN()** method and then hangs
            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);

    if (nResult)
        ASSERT(pThreadState->m_pAlternateWndInit == NULL);
    pThreadState->m_pAlternateWndInit = NULL;

    // Second part of special case for file open/save dialog.
    if (bEnableParent)
        ::EnableWindow(m_ofn.hwndOwner, TRUE);
    if (::IsWindow(hWndFocus))
        ::SetFocus(hWndFocus);

    PostModal();
    return nResult ? nResult : IDCANCEL;
}

推荐答案

DoModal很好,请相信我.
请在执行初始化的地方发布代码,然后调用DoModal.
DoModal is fine, trust me.
Please post your code where your doing the initialization and then calling DoModal.


这篇关于VC ++ 2010:“显示打开"对话框挂起的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆