CommonDialog wird nicht aufgerufen
-
Ich benutze die Klasse 'CPropertyList' (zu finden auf codeproject_de).
Aus diesem Control heraus rufe ich den 'CColorDialog'-Dialog auf wenn ich auf ein, im Control befindliches Button, klicke. Das hat bisher immer geklappt, nur dieses Mal nicht !?
Es kann definitiv nicht an eventuellen Programmierfehlern der PropertyList liegen.
Zu meinem Dialogfeld, welches die fehlerhafte PropertyList benutzt:
- Das Dialogfeld wird modal erzeugt
- Das ganze Programm befindet sich nicht in einer DLL, noch benutzt es eine
- MFC wird in statischer Bibliothek verwendet
- Laufzeitbibliothek: Multithreaded (/MT)Fehlerbeschreibung:
- Bei Aufruf des FontDialog sagt der debuger liegt das Problem in CFontDialog::FillInLogFont()
- Bei Aufruf des ColorDialog bleibt das Programm anscheinend in einer while(TRUE) oder Ähnlichem hängenIch habe absolut keine Ahnung wo ich den Fehler suchen soll !?
Hoffe das Ihr mir hier weiterhelfen könnt.
Mfg
Marco
-
Der Fehler tritt nicht nur in der PropertyList auf, sondern auch in allen anderen getesteten Controls und im Hauptdialogfeld.
Komischer weise kann ich innerhalb 'OnInitDialog()' des Dialogfeldes alle Dialoge aufrufen. Sobald es initialisiert wurde, und ich den ColorDialog zum Bsp. in 'OnHelpInfo()' aufrufe, tritt der Fehler auf.
-
Und was sagen die Rückgabewerte?
CommDlgExtendedError etc?
-
Das kann ich leider nicht testen, da das Programm innerhalb DoModal() des CommonDlg abstürzt. An den Rückgabewert komme ich nicht dran

-
Was sagt der Callstack wenn es crasht. Welcher Code von Dir ist noch im Spiel?
-
Beim ColorDialog sagt der CallStack:
DWORD CFontDialog::FillInLogFont(const CHARFORMAT& cf) { USES_CONVERSION; DWORD dwFlags = 0; [b]BOOL bIsFormat2 = (cf.cbSize >= sizeof(CHARFORMAT2))[/b]; if (cf.dwMask & CFM_SIZE) {Der Fehler ist in der fetten Zeile (Zeile 123, dlgfnt.cpp)
Den ColorDialog kann ich nicht testen, da dort ja nur nen Stapelüberlauf ausgelöst wird und er nicht richtig abstürzt.
-
Und was sagt der this Pointer an der Stelle? Ist this etwa NULL?
BTW: Das ist nicht der Callstack. Ich meine den gesamten Aufrufs Stack, der zum Fehler führt. Es kann ja sehr gut eine Funktion darunter sein, die den Fehler auslöst.
-
sorry, dachte dir würde der ferhlerpunkt reinchen, hier der callstack:
> Printlist Generator.exe!CFontDialog::FillInLogFont(const _charformat & cf={...}) Zeile 123 + 0x3 C++ Printlist Generator.exe!CFontDialog::CFontDialog(const _charformat & charformat={...}, unsigned long dwFlags=257, CDC * pdcPrinter=0x00000000, CWnd * pParentWnd=0x00a7930c) Zeile 69 + 0xc C++ Printlist Generator.exe!CPropertyList::OnButton() Zeile 497 + 0x1d C++ Printlist Generator.exe!_AfxDispatchCmdMsg(CCmdTarget * pTarget=0x00a7930c, unsigned int nID=714, int nCode=0, void (void)* pfn=0x0041a200, void * pExtra=0x00000000, unsigned int nSig=53, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 89 C++ Printlist Generator.exe!CCmdTarget::OnCmdMsg(unsigned int nID=714, int nCode=0, void * pExtra=0x00000000, AFX_CMDHANDLERINFO * pHandlerInfo=0x00000000) Zeile 396 + 0x27 C++ Printlist Generator.exe!CWnd::OnCommand(unsigned int wParam=714, long lParam=67346) Zeile 2550 C++ Printlist Generator.exe!CWnd::OnWndMsg(unsigned int message=273, unsigned int wParam=714, long lParam=67346, long * pResult=0x0012e68c) Zeile 1759 + 0x1c C++ Printlist Generator.exe!CWnd::WindowProc(unsigned int message=273, unsigned int wParam=714, long lParam=67346) Zeile 1745 + 0x1e C++ Printlist Generator.exe!AfxCallWndProc(CWnd * pWnd=0x00a7930c, HWND__ * hWnd=0x00010704, unsigned int nMsg=273, unsigned int wParam=714, long lParam=67346) Zeile 241 + 0x1a C++ Printlist Generator.exe!AfxWndProc(HWND__ * hWnd=0x00010704, unsigned int nMsg=273, unsigned int wParam=714, long lParam=67346) Zeile 389 C++der this pointer ist ok.
-
hat mit der auslastung hat sich geklärt. ist aber unerheblich. das problem mit dem FontDialog besteht aber weiterhin und ist auch unverändert -.-
-
Zeig mal den Code in OnButton!
-
void CPropertyList::OnButton() { CPropertyItem* pItem = (CPropertyItem*) GetItemDataPtr(m_curSel); //display the appropriate common dialog depending on what type //of chooser is associated with the property if (pItem->m_nItemType == PIT_COLOR) { CColorDialog ClrDlg(pItem->cClrValue, CC_FULLOPEN); if (IDOK == ClrDlg.DoModal()) { m_btnCtrl.ShowWindow(SW_HIDE); pItem->cClrValue = ClrDlg.GetColor(); Invalidate(); } } else if (pItem->m_nItemType == PIT_FILE) { CString SelectedFile; CString Filter("Gif Files (*.gif)|*.gif||"); CFileDialog FileDlg(TRUE, NULL, NULL, NULL, Filter); CString currPath = pItem->m_cCurValue; FileDlg.m_ofn.lpstrTitle = "Select file"; if (currPath.GetLength() > 0) FileDlg.m_ofn.lpstrInitialDir = currPath.Left( currPath.GetLength() - currPath.ReverseFind('\\')); if(IDOK == FileDlg.DoModal()) { SelectedFile = FileDlg.GetPathName(); m_btnCtrl.ShowWindow(SW_HIDE); pItem->m_cCurValue = SelectedFile; Invalidate(); } } else if (pItem->m_nItemType == PIT_FONT) { CHARFORMAT *cFormatTmp; if (pItem->vValue != NULL) cFormatTmp = (CHARFORMAT*) pItem->vValue; else cFormatTmp = NULL; CFontDialog FontDlg(*cFormatTmp, CF_EFFECTS | CF_SCREENFONTS, NULL, this); if(IDOK == FontDlg.DoModal()) { pItem->m_cCurValue = FontDlg.GetFaceName(); if (pItem->vValue != NULL) { CHARFORMAT cFormat, *cFormatRef; FontDlg.GetCharFormat(cFormat); cFormatRef = (CHARFORMAT*) pItem->vValue; *cFormatRef = cFormat; } m_btnCtrl.ShowWindow(SW_HIDE); Invalidate(); } } }je nach itemtyp wird der entsprechende dialog aufgerufen. der code funktioniert ja sonst einwandfrei. ich kann nur nicht sagen was an meiner anwendung / dialogfeld anders ist !?