информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаЗа кого нас держат?
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / beginners
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





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

> И похоже, что в очередь сообщений уже попало WM_QUIT,
> которое при дальнейшей обработке приводит к немедленному
> закрытию всех свежесозданных окон. По крайней мере, если
> воткнуть пониже
Насколько я это понимаю, для CHelloApp такое понятие как очередь сообщений появляется только после того, как InitInstance вернет значение TRUE - до этого момента никто извне никак на его работу повлиять не может. Ну а то что WM_QUIT посылается в диалог опять же непонятно каким образом прерывает выполнение 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-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach