Такая проблема:
Есть стандартно сгенерированное app с CRichEdit... MDI Doc\View.
В explorer давлю на *.dde file, в OnDDECommand пытаюсь открыть несуществующий файл и после этого CWinApp::m_pMainWnd становиться нулём
BOOL CTestDDEApp::OnDDECommand(LPTSTR lpszCommand)
{
ASSERT (0); // <- здесь начинаем дебагить
OpenDocumentFile("No such file..."); // CWinApp::m_pMainWnd - ok
// CWinApp::m_pMainWnd == NULL !!!return CWinApp::OnDDECommand(lpszCommand);
}
Может ли кто-нибудь подсказать почему так?
Если же app сгенерировать с CEdit... MDI Doc\View, то такой ошибкии не возникает
Alexeib wrote: > > Всем привет! > > Такая проблема: > Есть стандартно сгенерированное app с CRichEdit... MDI Doc\View. > В explorer давлю на *.dde file, в OnDDECommand пытаюсь открыть несуществующий файл и после этого CWinApp::m_pMainWnd становиться нулём > >
Не понял, к чему это. Я тебе предлагаю на вызове OpenDocumentFile нажать
F11 и дальше идти по F11, глядя при этом на m_pMainWnd. Так и найдешь,
где она в 0 сбрасывается.
PD>Не понял, к чему это. Я тебе предлагаю на вызове OpenDocumentFile нажать PD>F11 и дальше идти по F11, глядя при этом на m_pMainWnd. Так и найдешь, PD>где она в 0 сбрасывается.
Я так и сделал,
Прога доходит до CMDIChildWnd::DestroyWindow // уничтожает окно, потому что не может открыть файл
и там где я указал, она сбрасывает m_pMainWnd.
Alexeib wrote: > > PD>Не понял, к чему это. Я тебе предлагаю на вызове OpenDocumentFile нажать > PD>F11 и дальше идти по F11, глядя при этом на m_pMainWnd. Так и найдешь, > PD>где она в 0 сбрасывается. > > Я так и сделал, > > Прога доходит до CMDIChildWnd::DestroyWindow // уничтожает окно, потому что не может открыть файл > и там где я указал, она сбрасывает m_pMainWnd.
Это отсюда вызвано ?
if (!pDocument->OnNewDocument())
{
// user has be alerted to what failed in OnNewDocument
TRACE0("CDocument::OnNewDocument returned FALSE.\n");
pFrame->DestroyWindow();
return NULL;
}
или отсюда ?
if (!pDocument->OnOpenDocument(lpszPathName))
{
// user has be alerted to what failed in OnOpenDocument
TRACE0("CDocument::OnOpenDocument returned FALSE.\n");
pFrame->DestroyWindow();
return NULL;
}
В первом случае смотри свою OnNewDocument(), во втором —
OnOpenDocument(lpszPathName) (я полагаю, что имеет место второй случай).
Там и причина. Протрассируй OnOpenDocument, аккуратно по F111.
PD>В первом случае смотри свою OnNewDocument(), во втором - PD>OnOpenDocument(lpszPathName) (я полагаю, что имеет место второй случай). PD>Там и причина. Протрассируй OnOpenDocument, аккуратно по F111.
Второй вариант.
стандартно сгенерированное app
Нет у меня в этой тестовой проге своих OnNewDocument и OnOpenDocument...
Да и дело не в них ИМХО. Почему когда в CMDIChildWnd::DestroyWindow() вызывается MDIDestroy()
уничтожается ВЕСЬ MainFrameWnd, а не одно ChildWnd ?
PD>-- PD>With best regards, PD> Pavel Dvorkin
Alexeib wrote: > Да и дело не в них ИМХО. Почему когда в CMDIChildWnd::DestroyWindow() вызывается MDIDestroy() > уничтожается ВЕСЬ MainFrameWnd, а не одно ChildWnd ?
Не знаю, но суть в том, что
if (!pDocument->OnOpenDocument(lpszPathName))
{
// user has be alerted to what failed in OnOpenDocument
TRACE0("CDocument::OnOpenDocument returned FALSE.\n");
pFrame->DestroyWindow();
return NULL;
}
Так что если не удалось открыть документ — закрывается фрейм. Почему —
вопрос к авторам MFC.
А с другой стороны — что ты хочешь ? Ты открываешь документ, а он не
открылся. Запустить программу без чайлдов, с пустым фреймом ? Может, это
и верно... Но сделано иначе.
PD>Так что если не удалось открыть документ — закрывается фрейм. Почему - PD>вопрос к авторам MFC.
Маленькая поправочка — должен закрываться Child Frame — CMDIChildWnd::MDIDestroy() и это меня вполне бы устроивало. А у меня вместе с Child Frame киляется и Main Frame и это мне мягко говоря беспокоит.
PD>А с другой стороны — что ты хочешь ? Ты открываешь документ, а он не PD>открылся. Запустить программу без чайлдов, с пустым фреймом ? Может, это PD>и верно... Но сделано иначе.
Возможно сделать, как раз, и так и так:
Поставть cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
в InitInstance()
PS. Есть ли возможность подписчику MSDN задать подобный вопрос напрямую разработчикам из MS ?
Alexeib wrote:
> PS. Есть ли возможность подписчику MSDN задать подобный вопрос напрямую разработчикам из MS ?
Теоретически есть. В MSDN внизу многих статей стоит "What do you think
of this topic?". Попробуй.
Но ИМХО лучше зайти на сервер msnews.microsoft.com (это news-сервер,
через Outlook Express), выбрать подходящую эху и задать вопрос. Мне
всегда отвечали (хотя и не всегда из Микрософт, но если вопрос серьезный
— то кто-то из них)