CRichEdit & DDE bug в VC++.NET 2003
От: Alexeib Япония  
Дата: 05.08.04 11:08
Оценка:
Всем привет!

Такая проблема:
Есть стандартно сгенерированное 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, то такой ошибкии не возникает

http://www.rsdn.ru:80/File/31992/TestDDE.zip
Re: CRichEdit & DDE bug в VC++.NET 2003
От: Pavel Dvorkin Россия  
Дата: 05.08.04 11:17
Оценка:
Привет!

Alexeib wrote:
>
> Всем привет!
>
> Такая проблема:
> Есть стандартно сгенерированное 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);
> }
>

>
> Может ли кто-нибудь подсказать почему так?

Протрассируй вызов OpenDocumentFile.


--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
Re[2]: CRichEdit & DDE bug в VC++.NET 2003
От: Alexeib Япония  
Дата: 05.08.04 11:25
Оценка:
PD>Протрассируй вызов OpenDocumentFile.

BOOL CMDIChildWnd::DestroyWindow()
{
    if (m_hWnd == NULL)
        return FALSE;

    // avoid changing the caption during the destroy message(s)
    CMDIFrameWnd* pFrameWnd = GetMDIFrame();
    HWND hWndFrame = pFrameWnd->m_hWnd;
    ASSERT(::IsWindow(hWndFrame));
    DWORD dwStyle = SetWindowLong(hWndFrame, GWL_STYLE,
        GetWindowLong(hWndFrame, GWL_STYLE) & ~FWS_ADDTOTITLE);

    MDIDestroy();  // <---- после этого вызова CWinApp::m_pMainWnd становиться == NULL

    if (::IsWindow(hWndFrame))
    {
        ASSERT(hWndFrame == pFrameWnd->m_hWnd);
        SetWindowLong(hWndFrame, GWL_STYLE, dwStyle);
        pFrameWnd->OnUpdateFrameTitle(TRUE);
    }

    return TRUE;
}
Re[3]: CRichEdit & DDE bug в VC++.NET 2003
От: Pavel Dvorkin Россия  
Дата: 05.08.04 11:28
Оценка:
Привет!

Alexeib wrote:
>
> PD>Протрассируй вызов OpenDocumentFile.
>
> [ccode]
> BOOL CMDIChildWnd::DestroyWindow()

<skipped>

Не понял, к чему это. Я тебе предлагаю на вызове OpenDocumentFile нажать
F11 и дальше идти по F11, глядя при этом на m_pMainWnd. Так и найдешь,
где она в 0 сбрасывается.

--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
Re[4]: CRichEdit & DDE bug в VC++.NET 2003
От: Alexeib Япония  
Дата: 05.08.04 11:37
Оценка:
PD>Не понял, к чему это. Я тебе предлагаю на вызове OpenDocumentFile нажать
PD>F11 и дальше идти по F11, глядя при этом на m_pMainWnd. Так и найдешь,
PD>где она в 0 сбрасывается.

Я так и сделал,


Прога доходит до CMDIChildWnd::DestroyWindow // уничтожает окно, потому что не может открыть файл
и там где я указал, она сбрасывает m_pMainWnd.

Смотри call stack
Re[5]: CRichEdit & DDE bug в VC++.NET 2003
От: Pavel Dvorkin Россия  
Дата: 05.08.04 11:44
Оценка:
Привет!

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.

--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
Re[6]: CRichEdit & DDE bug в VC++.NET 2003
От: Pavel Dvorkin Россия  
Дата: 05.08.04 11:45
Оценка:
По F11, сорри

--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
Re[6]: CRichEdit & DDE bug в VC++.NET 2003
От: Alexeib Япония  
Дата: 05.08.04 11:57
Оценка:
PD>В первом случае смотри свою OnNewDocument(), во втором -
PD>OnOpenDocument(lpszPathName) (я полагаю, что имеет место второй случай).
PD>Там и причина. Протрассируй OnOpenDocument, аккуратно по F111.


Второй вариант.

стандартно сгенерированное app


Нет у меня в этой тестовой проге своих OnNewDocument и OnOpenDocument...
Да и дело не в них ИМХО. Почему когда в CMDIChildWnd::DestroyWindow() вызывается MDIDestroy()
уничтожается ВЕСЬ MainFrameWnd, а не одно ChildWnd ?

PD>--

PD>With best regards,
PD> Pavel Dvorkin
Re[7]: CRichEdit & DDE bug в VC++.NET 2003
От: Alexeib Япония  
Дата: 05.08.04 11:59
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:


PD>По F11, сорри


never mind

PD>--

PD>With best regards,
PD> Pavel Dvorkin
Re[7]: CRichEdit & DDE bug в VC++.NET 2003
От: Pavel Dvorkin Россия  
Дата: 05.08.04 12:05
Оценка:
Привет!

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.

А с другой стороны — что ты хочешь ? Ты открываешь документ, а он не
открылся. Запустить программу без чайлдов, с пустым фреймом ? Может, это
и верно... Но сделано иначе.



--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
Re[8]: CRichEdit & DDE bug в VC++.NET 2003
От: Alexeib Япония  
Дата: 05.08.04 12:26
Оценка:
PD>Так что если не удалось открыть документ — закрывается фрейм. Почему -
PD>вопрос к авторам MFC.

Маленькая поправочка — должен закрываться Child Frame — CMDIChildWnd::MDIDestroy() и это меня вполне бы устроивало. А у меня вместе с Child Frame киляется и Main Frame и это мне мягко говоря беспокоит.

PD>А с другой стороны — что ты хочешь ? Ты открываешь документ, а он не

PD>открылся. Запустить программу без чайлдов, с пустым фреймом ? Может, это
PD>и верно... Но сделано иначе.

Возможно сделать, как раз, и так и так:
Поставть cmdInfo.m_nShellCommand = CCommandLineInfo::FileNothing;
в InitInstance()

PS. Есть ли возможность подписчику MSDN задать подобный вопрос напрямую разработчикам из MS ?
Re[9]: CRichEdit & DDE bug в VC++.NET 2003
От: Pavel Dvorkin Россия  
Дата: 05.08.04 12:31
Оценка:
Привет!

Alexeib wrote:

> PS. Есть ли возможность подписчику MSDN задать подобный вопрос напрямую разработчикам из MS ?


Теоретически есть. В MSDN внизу многих статей стоит "What do you think
of this topic?". Попробуй.

Но ИМХО лучше зайти на сервер msnews.microsoft.com (это news-сервер,
через Outlook Express), выбрать подходящую эху и задать вопрос. Мне
всегда отвечали (хотя и не всегда из Микрософт, но если вопрос серьезный
— то кто-то из них)

--
With best regards,
Pavel Dvorkin
Posted via RSDN NNTP Server 1.7 "Bedlam"
With best regards
Pavel Dvorkin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.