CMFCToolBar
-
Verwendet Die Anwendnung Ihr CWinApp oder CWinAppEx?
-
Martin Richter schrieb:
Verwendet Die Anwendnung Ihr CWinApp oder CWinAppEx?
Hi Martin, gute Idee.
Der Dialog wurde ja bereits von CDialogEx abgeleitet; da macht evtl. Sinn.
Das vom Assistenten erstellte Gerüst basiert auf CWinApp.
Habe die Klasse nun von CWinAppEx abgeleitet. Dabei entstehen
scheinbar neue Probleme; diesmal mit dem CShellManager.Habe den zugehörigen Code entfernt.
CShellManager *pShellManager = new CShellManager;
sowie
if (pShellManager != NULL){ delete pShellManager; }
Ausserdem habe ich den Registry-Zugriff entfernt
SetRegistryKey(_T("Vom lokalen Anwendungs-Assistenten generierte Anwendungen"));
Der Memory-Leak ist noch da.
Auch abändern von
CWinAppEx::InitInstance();
ändertz daran nichts.
-
Hallo Martin,
gerade ausprobiert, ich verwende es in der Demo ohne Ex und mit CWinAppEx gibt es kein Leak mehr!
Sehr gut.
habe das Manager-Console gedünst entfernt dann lief es.
Dies betrifft leider nur diese kleine Demo, in meiner
Anwendung bleibt das Leak trotz Umbau auf AppEx erhalten.
(afxtooltipmanager.cpp(70) : {904} client block at 0x00B46DA0)Danke für den Hinweis, grüße und Erfolg.
Karsten.
-
Rufts Du auch in Deiner App ExitInstance von CWinAppEx?
-
Ja das mache ich, auch gerade mit Haltepunkt wird auch ausgelößt.
Das ist eine App die erzeugt bei mir kein Dialog sondern einen CWnd
und hat eine eigene Run -Pumpe:BOOL CPatControlApp::InitInstance() { CWinAppEx::InitInstance(); AfxEnableControlContainer(); InitCommonControls(); AfxOleInit(); //..... LPCTSTR pszCreateClass = AfxRegisterWndClass(CS_HREDRAW | CS_VREDRAW, ::LoadCursor(NULL, IDC_ARROW)); if (!pdlg->CreateEx(0, pszCreateClass, "PatControl", WS_OVERLAPPEDWINDOW | WS_VISIBLE, CRect(0,0,800,600), 0, 0)) return CVersions::DbgMsg(false, "CPatControlApp::InitInstance Error Create MainWindow\r\n"); pdlg->ShowWindow(SW_SHOW); pdlg->UpdateWindow(); return TRUE; } int CPatControlApp::Run() { MSG msg; //LARGE_INTEGER StartingTime, Frequency; //QueryPerformanceFrequency(&Frequency); while (1) { if(::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE)) { if (!PumpMessage()) { ::PostQuitMessage(0); break; } }else WaitMessage(); } return TRUE; }
Allerdings habe ich ein paar ActiveX Objekte die im CWnd geladen werden,
diese sind garnicht über CWinAppEx sondern zwanghaft via COleControlModule
was von CWinApp -gelitten ist.Ich habe gerade alle CWinApp kopplungen beteidigter DLL's gegen CWinAppEx
umgelitten. Das Leak bleibt erbärmlich bestehen, verschwindet fein im tausch gegen CToolBar.Vielleicht stimmt was nicht bei InitInstance ggf. etwas neues vergessen ?
Christliche Grüße
Karsten
-
Nachdem ich EnableToolTips(TRUE) auskommentiert habe läuft es nun fehlerfrei
ohne Memory-Leak.Tooltips aus Prompt werden mit OnNeedText() angezeigt
ON_NOTIFY_EX(TTN_NEEDTEXT, 0, &CCMFCToolBar_DemoDlg::OnNeedText)
Der Befehl ExitInstance() existiert im Code nicht, und scheint auch nicht notwendig zu sein.
-
Hallo Merano,
richtig in dem simple Example gibt es keine Exitinstance
wird dann direkt über CWinApp angerufen.Dito gibt es ON_NOTIFY_EX(TTN_NEEDTEXT, 0, OnNeedText) nicht in der demo.
Und es gibt auch kein Memory leak nach der herleitung statt CWinApp zu
CWinAppExIn meiner Base Anwendung verwende ich jedoch tooltips über die Menuresource
die toolbar hat in der resource keine texte bekommen sondern nutzt die menus.
Die wiederum sind von BCMenu herglitten. Und ich verwendeBOOL CPatControlDlg::OnNeedText(UINT id, NMHDR* pNMHDR, LRESULT* pResult) { //CMFCToolBar UINT_PTR nId = pNMHDR->idFrom - 1; CMFCToolBarButton *pBtn = m_ToolBar.GetButton(nId); if(pBtn) { TCHAR szBuff[64]; LoadString(AfxGetResourceHandle(), pBtn->m_nID, szBuff, sizeof(szBuff) / sizeof(TCHAR)); TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR; pTTT->lpszText = szBuff; pTTT->hinst = AfxGetResourceHandle(); } /* //CToolBar NMTOOLBAR* pNMToolBar = (NMTOOLBAR*)pNMHDR; TOOLTIPTEXT *pTTT = (TOOLTIPTEXT *)pNMHDR; UINT_PTR nId = pNMHDR->idFrom; TCHAR szBuff[128]; LoadString(AfxGetResourceHandle(), nId, szBuff, sizeof(szBuff) / sizeof(TCHAR)); pTTT->lpszText = szBuff; pTTT->hinst = AfxGetResourceHandle(); */ return TRUE; }
Je nachdem ob ich CToolBar oder CMFCToolBar verwende kommentiere ich das "um",
selbst wenn ich das ganze event still lege bleibt es beim leak, es reicht das einfache CMFCToolBar::Create aus um das leak zu erzeugen.Wenn ich m_ToolBar.EnableToolTips(FALSE); nach Create auslöse oder das
Flag CBRS_TOOLTIPS entferne ändert dies nichts bei mir.Sehr interessant wie das bei Dir wirkt, du hast mit dem wizzard einen dialog erzeugt und auf CWinAppEx umgelitten, den kram entfernt und alles ist fein, mit
CMFCToolBar so ist das bei mir.Ich versuche jedoch zu ergründen warum mein Programm das nun wesentlich größere Außmaße hat als die demo, das leak trotz der modifikationen nach CWinAppEx wirft.
Das ist ja irre..
Danke für deine Hilfe!
Gruß
Karsten
-
Ich habe nun mein CWnd von CFrameWndEx abgelitten auch das löst das problem nicht außerdem habe ich in InitApplication folgendes hinzu addiert:
AfxEnableControlContainer(); INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinAppEx::InitInstance(); AfxOleInit(); InitContextMenuManager(); InitKeyboardManager(); InitTooltipManager(); CMFCToolTipInfo ttParams; ttParams.m_bVislManagerTheme = TRUE; theApp.GetTooltipManager()->SetTooltipParams(AFX_TOOLTIP_TYPE_ALL, RUNTIME_CLASS(CMFCToolTipCtrl), &ttParams);
Das ist ja ein feines Spiel...
-
Egal ob mit oder ohne OnNeedText()-Handler gibt es bei mir keinen Leak.
Lediglich die Tooltips werden nicht mehr angezeigt.Die Toolbar sieht als Resource so bei mir aus:
/////////////////////////////////////////////////////////////////////////////
//
// Toolbar
//IDR_TOOLBAR1 TOOLBAR 16, 15
BEGIN
BUTTON ID_BUTTON32771
BUTTON ID_BUTTON32772
BUTTON ID_BUTTON32773
BUTTON ID_BUTTON32774
BUTTON ID_BUTTON32775
END/////////////////////////////////////////////////////////////////////////////
//
// Bitmap
//IDR_TOOLBAR1 BITMAP "res\\toolbar1.bmp"
/////////////////////////////////////////////////////////////////////////////
//
// String Table
//STRINGTABLE
BEGIN
IDS_ABOUTBOX "&Info über CMFCToolBar_Demo..."
ENDSTRINGTABLE
BEGIN
ID_BUTTON32771 "eins"
ID_BUTTON32772 "zwei"
ID_BUTTON32773 "drei"
ID_BUTTON32774 "vier"
ID_BUTTON32775 "fünf"
END#endif // Deutsch (Deutschland) resources
/////////////////////////////////////////////////////////////////////////////Die Texte "eins", "zwei" u.s.w. wurden im Resourceneditor als "Prompt" angegeben. (Es wird automatisch eine Stringtable daraus.)
OnNeedText() sieht bei fast genauso sus; den Teil mit BCMenu verstehe ich nicht.
Ich würde den Code eher abspecken als ihn noch weiter aufzupumpen.
Das Leak ist für mich mit dem gezeigten Code nicht nachvollziehbar.
-
Naja Dank Dir für die Mühe, ich belasse es bei dem altbewährten.
Mit dem Teil gibt es Probleme die sich nicht einfach lösen lassen,
muss eine kombination sein aus überldenen Menus wie ich sie nutze (BCMenu)
und COleControl 's die keine CWinApiEx kennen. Alles wunderbar.Grüße und Erfolg
Karsten