Написал приложение отображающее диалоговое окошко, попробовал проверить на утечки памяти и вот, что не понравилось дебагеру: без одной строчки нижеприведенный код не имеет утечек памяти, а при ее добавлении появляется 4 байта утечки! Может фильтр сообщений нужно еще как-то удалить? | Код | int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE /*hPrevInstance*/, LPTSTR lpstrCmdLine, int nCmdShow) {
HRESULT hRes = ::CoInitialize(NULL); // If you are running on NT 4.0 or higher you can use the following call instead to // make the EXE free threaded. This means that calls come in on a random RPC thread. // HRESULT hRes = ::CoInitializeEx(NULL, COINIT_MULTITHREADED); ATLASSERT(SUCCEEDED(hRes));
#if (_WIN32_IE >= 0x0300) INITCOMMONCONTROLSEX iccx; iccx.dwSize = sizeof(iccx); iccx.dwICC = ICC_COOL_CLASSES | ICC_BAR_CLASSES; BOOL bRet = ::InitCommonControlsEx(&iccx);
bRet; ATLASSERT(bRet); #else ::InitCommonControls(); #endif
hRes = _Module.Init(NULL, hInstance);
CMessageLoop loop; _Module.AddMessageLoop(&loop);
CMainDlg mainDlg; mainDlg.Create(0);
int nRet = loop.Run();
_Module.Term(); ::CoUninitialize();
_CrtDumpMemoryLeaks(); }
|
| Код | #include "resource.h" #include "precompile.h"
class CMainDlg : public CDialogImpl<CMainDlg>, public CWinDataExchange<CMainDlg>, public CUpdateUI<CMainDlg>, public CMessageFilter {
public: CMainDlg(); virtual ~CMainDlg();
enum { IDD = IDD_DIALOG_MAIN };
BEGIN_MSG_MAP_EX(CMainDlg) MESSAGE_HANDLER_EX(WM_INITDIALOG, OnInitDialog) MSG_WM_CLOSE(OnClose) MSG_WM_DESTROY(OnDestroy)
REFLECT_NOTIFICATIONS() END_MSG_MAP() BEGIN_DDX_MAP(CMainDlg) END_DDX_MAP()
BEGIN_UPDATE_UI_MAP(CMainDlg) END_UPDATE_UI_MAP()
LRESULT OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/);
BOOL PreTranslateMessage(MSG *pMsg);
void OnDestroy();
void OnClose(); };
|
| Код | #include "MainDlg.h"
CMainDlg::CMainDlg() {
}
CMainDlg::~CMainDlg() {
}
LRESULT CMainDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/) {
//add message filter _Module.GetMessageLoop()->AddMessageFilter(this); // <= Вот эта самая строчка !!!
// center the dialog on the screen CenterWindow(0); ShowWindow(SW_SHOW);
return 0; }
BOOL CMainDlg::PreTranslateMessage(MSG *pMsg) {
HWND focused = ::GetFocus();
if (pMsg->message == WM_KEYDOWN) { }
return IsDialogMessage(pMsg); }
void CMainDlg::OnDestroy() { PostQuitMessage(0); }
void CMainDlg::OnClose() { _Module.GetMessageLoop()->RemoveMessageFilter(this); DestroyWindow(); }
|
Это сообщение отредактировал(а) zhekha - 8.8.2007, 10:58
|