CFileDialog::DoModal() never returns
I am encountering a wierd error, and I can't figure out which way to turn.
Something deep within the call tree of CFileDialog::DoModal() is (apparently)
failing, causing the dialog to never be displayed, and the f() never to
return. Here's the failing code:
void CPvtDlg::OnBnClickedBnFileBd()
{
// specify a file
CFileDialog fileOpenBox ( TRUE,
// BOOL bOpenFileDialog
NULL,
// LPCTSTR lpszDefExt
NULL,
// LPCTSTR lpszFileName
(OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT),
// DWORD dwFlags
NULL, // LPCTSTR lpszFilter
NULL );
// CWnd* pParentWnd
// extract file name
if( IDOK == fileOpenBox.DoModal() )
{
m_strFileNameBd = fileOpenBox.GetFileName();
m_strPathNameBd = fileOpenBox.GetPathName();
}
....
Single stepping, I am unable to step over the DoModal() call. Stepping into
the call to DoModal(), I find myself inside dlgfile.cpp:
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_ofn.Flags & OFN_EXPLORER)
pThreadState->m_pAlternateWndInit = this;
else
AfxHookWindowCreate(this);
INT_PTR nResult;
if (m_bOpenFileDialog)
nResult = ::AfxCtxGetOpenFileName(&m_ofn);
else
nResult = ::AfxCtxGetSaveFileName(&m_ofn);
....
I am unable to step over the call to ::AfxCtxGetOpenFileName(&m_ofn); in the
if branch above. Stepping into it allows me to step through
OPENFILENAME& CFileDialog::GetOFN()
{
return *m_pOFN;
}
and
COMMDLG_AFXCTXFUNC(BOOL,GetOpenFileNameW,(LPOPENFILENAMEW
unnamed1),(unnamed1))
to
AFX_MODULE_STATE* AFXAPI AfxGetModuleState()
{
_AFX_THREAD_STATE* pState = _afxThreadState;
ENSURE(pState);
AFX_MODULE_STATE* pResult;
if (pState->m_pModuleState != NULL)
{
// thread state's module state serves as override
pResult = pState->m_pModuleState;
}
else
{
// otherwise, use global app state
pResult = _afxBaseModuleState.GetData();
}
ENSURE(pResult != NULL);
return pResult;
}
back through
COMMDLG_AFXCTXFUNC(BOOL,GetOpenFileNameW,(LPOPENFILENAMEW
unnamed1),(unnamed1))
I could probably continue, but it seems to me that I am inside the innards
of an area of the libs that I have no business in. What is it up in the API
level that I am screwing up?