информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Spanning Tree Protocol: недокументированное применениеЗа кого нас держат?Где водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Крупный взлом GoDaddy 
 Просроченный сертификат ломает... 
 Phrack #70/0x46 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / beginners
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Господа, будьте снисходительны, не бросайтесь сразу штрафовать за, как вам кажется, глупые вопросы - beginners на то и beginners.
Просто если главное окно _уже_ было задано, то обработка его... 23.10.07 00:12  Число просмотров: 2446
Автор: dl <Dmitry Leonov>
<"чистая" ссылка>
> Я только начал MFC изучать, так что пока плохо соображаю,
> что к чему, но не понятно какое отношение в данном случае
> вообще переменная m_pMainWnd имеет к AfxMessageBox
> (допустим мы поменяем сообщение на простое "Hello World"
> без обращения к члену диалога). Если вообще не создавать
> никакого окна и сразу в InitInstance прописать
> AfxMessageBox то оно нормально сработает с нулевым
> m_pMainWnd.

Просто если главное окноужебыло задано, то обработка его закрытия имеет особый смысл для приложения. И после этого функция GetMessage, которая вызывается при создании всех последующих окон искренне считает, что приложение находится на стадии завершения и возвращает ноль, что приводит к практически мгновенному закрытию всех в дальнейшем создаваемых окон. Кстати, если не инициализировать m_pMainWnd, то есть шанс что все заработает как ожидалось.

> > И похоже, что в очередь сообщений уже попало WM_QUIT,
> > которое при дальнейшей обработке приводит к
> немедленному
> > закрытию всех свежесозданных окон. По крайней мере,
> если
> > воткнуть пониже
> Насколько я это понимаю, для CHelloApp такое понятие как
> очередь сообщений появляется только после того, как
> InitInstance вернет значение TRUE - до этого момента никто
> извне никак на его работу повлиять не может. Ну а то что
> WM_QUIT посылается в диалог опять же непонятно каким
> образом прерывает выполнение InitInstance.

Не совсем так. В случае приложения с главным окном-диалогом после завершения InitInstance завершается и все приложение, а качестве его очереди сообщений используется диалоговая.

> > и сходить дебаггером внутрь, то во внутренностях
> Пытался с этим разобраться, но пока совершенно ситуация для
> меня никак не проясняется.
<beginners>
[MFC] Обломался с Hello World 21.10.07 00:04  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
Только начал изучать MFC. VIsual C++ 6. Файл проекта в архиве: http://heller.ru/hrenvam/hello.7z. Ниже приведу сырц, если надо.

В общем компилируется и запускается все нормально, но в InitInstance написано после dlg.DoModal() показать еще и AfxMessageBox, чего не происходит. Не понимаю почему. Даже догадок не имею. Код полностью:

#include "afxwin.h"
#include "resource.h"

class CHelloApp : public CWinApp {
public:
	virtual BOOL InitInstance();
};

CHelloApp app;

class CHelloDialog : public CDialog {
public:
	CString m_Text;
	CHelloDialog();
protected:
	virtual void OnCancel();
	virtual void OnOK();
	virtual void DoDataExchange(CDataExchange* pDX);
	afx_msg void OnDefault();
	DECLARE_MESSAGE_MAP()
};

BEGIN_MESSAGE_MAP(CHelloDialog, CDialog)
	ON_BN_CLICKED(IDC_BUTTON1, OnDefault)
END_MESSAGE_MAP()

BOOL CHelloApp::InitInstance()
{
	CHelloDialog dlg;
	m_pMainWnd = &dlg;
	dlg.DoModal();
	AfxMessageBox(dlg.m_Text);
	return FALSE;
}


CHelloDialog::CHelloDialog() : CDialog(IDD_DIALOG1)
{
	m_Text = "";
}

void CHelloDialog::OnDefault()
{
	m_Text = "Hello World!";
	UpdateData(FALSE);
	MessageBeep(0);
}

void CHelloDialog::DoDataExchange(CDataExchange *pDX)
{
	CDialog::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT1, m_Text);
}

void CHelloDialog::OnOK()
{
	CDialog::OnOK();
	MessageBeep(0);
}

void CHelloDialog::OnCancel()
{
	MessageBeep(0);
	CDialog::OnCancel();
}

---
главное окно уже закрылось 21.10.07 03:09  
Автор: dl <Dmitry Leonov>
<"чистая" ссылка>
И похоже, что в очередь сообщений уже попало WM_QUIT, которое при дальнейшей обработке приводит к немедленному закрытию всех свежесозданных окон. По крайней мере, если воткнуть пониже

CHelloDialog dlg2;
dlg2.DoModal();

и сходить дебаггером внутрь, то во внутренностях CWnd::RunModalLoop оно доходит до этих пор и отваливается, сразу показав диалог:
			// pump message, but quit on WM_QUIT
			if (!AfxPumpMessage())
			{
				AfxPostQuitMessage(0);
				return -1;
			}

---
Пока сложно для меня 22.10.07 23:37  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
Я только начал MFC изучать, так что пока плохо соображаю, что к чему, но не понятно какое отношение в данном случае вообще переменная m_pMainWnd имеет к AfxMessageBox (допустим мы поменяем сообщение на простое "Hello World" без обращения к члену диалога). Если вообще не создавать никакого окна и сразу в InitInstance прописать AfxMessageBox то оно нормально сработает с нулевым m_pMainWnd.

> И похоже, что в очередь сообщений уже попало WM_QUIT,
> которое при дальнейшей обработке приводит к немедленному
> закрытию всех свежесозданных окон. По крайней мере, если
> воткнуть пониже
Насколько я это понимаю, для CHelloApp такое понятие как очередь сообщений появляется только после того, как InitInstance вернет значение TRUE - до этого момента никто извне никак на его работу повлиять не может. Ну а то что WM_QUIT посылается в диалог опять же непонятно каким образом прерывает выполнение InitInstance.

> и сходить дебаггером внутрь, то во внутренностях
Пытался с этим разобраться, но пока совершенно ситуация для меня никак не проясняется.
Просто если главное окно _уже_ было задано, то обработка его... 23.10.07 00:12  
Автор: dl <Dmitry Leonov>
<"чистая" ссылка>
> Я только начал MFC изучать, так что пока плохо соображаю,
> что к чему, но не понятно какое отношение в данном случае
> вообще переменная m_pMainWnd имеет к AfxMessageBox
> (допустим мы поменяем сообщение на простое "Hello World"
> без обращения к члену диалога). Если вообще не создавать
> никакого окна и сразу в InitInstance прописать
> AfxMessageBox то оно нормально сработает с нулевым
> m_pMainWnd.

Просто если главное окноужебыло задано, то обработка его закрытия имеет особый смысл для приложения. И после этого функция GetMessage, которая вызывается при создании всех последующих окон искренне считает, что приложение находится на стадии завершения и возвращает ноль, что приводит к практически мгновенному закрытию всех в дальнейшем создаваемых окон. Кстати, если не инициализировать m_pMainWnd, то есть шанс что все заработает как ожидалось.

> > И похоже, что в очередь сообщений уже попало WM_QUIT,
> > которое при дальнейшей обработке приводит к
> немедленному
> > закрытию всех свежесозданных окон. По крайней мере,
> если
> > воткнуть пониже
> Насколько я это понимаю, для CHelloApp такое понятие как
> очередь сообщений появляется только после того, как
> InitInstance вернет значение TRUE - до этого момента никто
> извне никак на его работу повлиять не может. Ну а то что
> WM_QUIT посылается в диалог опять же непонятно каким
> образом прерывает выполнение InitInstance.

Не совсем так. В случае приложения с главным окном-диалогом после завершения InitInstance завершается и все приложение, а качестве его очереди сообщений используется диалоговая.

> > и сходить дебаггером внутрь, то во внутренностях
> Пытался с этим разобраться, но пока совершенно ситуация для
> меня никак не проясняется.
Теперь разобрался, спасибо! 23.10.07 03:02  
Автор: Heller <Heller> Статус: Elderman
<"чистая" ссылка>
1






Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2021 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach