Dialogfeldproblem
-
Hi @ all!
Ich öffne über
Create und ShowWindow 3 Dialogfeldfenstern nacheinander. Schließe sie aber nicht sonder will sie als Grafikkontrollfenster haben. Sobald ich nun auf das erste der 3 Fensterklicke bekomme ich einen Programmabsturz und Windows wirft mir ne Fehlermeldung raus. Da es aber kontrollfenster seien sollen muss ich nun mal alle 3 offen und auch zwischen ihnen herumspringen können. Wie kann ich das erreichen?Hier noch die Fehlermeldung:
Die Anweisung in "0x00411fd1" verweist auf Speicher in "0x00153000". Der Vorgang "read" konnte nicht auf dem Speicher durchgeführt werden.MfG
Blind
-
Im Debugger starten und prüfen, wo der Fehler auftritt...
-
Der Fehler tritt auf sobald das erste oder zweite Fenster angeklickt wird
-
Im Debugger starten und prüfen, wo (nicht wann) der Fehler auftritt...
-
Wie meinst du dass genau?
Der Debugger sagt bei mir
Nicht abgefangene Ausnahme in Firststep.exe: 0xC0000005: Access Violation.
-
blind schrieb:
Der Debugger sagt bei mir
Nicht abgefangene Ausnahme in Firststep.exe: 0xC0000005: Access Violation.In der angezeigten MessageBox sollte dann "Wiederholen" oder "Break" oder sowas angezeigt werden. Da klickst du dann drauf...
-
Nicht abgefangene Ausnahme in Firststep.exe: 0xC0000005: Access Violation.unter der Messagebox habe ich nur die wahl OK zu drücken und dann erscheint eine Disassemblierung in Code fenster mit dem Pfeil der ber Folgenden Zeile stehend:
00411FD1 mov al,byte ptr [ecx+edx]
-
Wie sieht der Callstack aus? Das ist eines der Debugfenster.
-
Welches der Folgenden Debug Fenster ist er den?
Register
Aufrufliste
Überwachung
Speicher
Variablen
Disemblierung
-
Aufrufliste
-
Bitte sehr
FIRSTSTEP! 00412481() CWnd::OnWndMsg(unsigned int 15, unsigned int 0, long 0, long * 0x0012fcb8) line 1825 CWnd::WindowProc(unsigned int 15, unsigned int 0, long 0) line 1585 + 30 bytes AfxCallWndProc(CWnd * 0x012e60e8 {CWnd hWnd=0x00170602}, HWND__ * 0x00170602, unsigned int 15, unsigned int 0, long 0) line 215 + 26 bytes AfxWndProc(HWND__ * 0x00170602, unsigned int 15, unsigned int 0, long 0) line 368 AfxWndProcBase(HWND__ * 0x00170602, unsigned int 15, unsigned int 0, long 0) line 220 + 21 bytes USER32! 77e02ca8() USER32! 77e04764() USER32! 77e04720() NTDLL! 778a15ef() USER32! 77e0577d() CWinThread::Run() line 487 + 11 bytes CWinApp::Run() line 400 AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00133227, int 1) line 49 + 11 bytes FIRSTSTEP! 00413618() FIRSTSTEP! 004134e3() KERNEL32! 77e787f5()
-
Doppelklickst du bitte mal auf die zweite Zeile von oben (CWnd::OnWndMsg) und zeigst ein wenig des Codeumfelds?
-
. . . case AfxSig_lwl: lResult = (this->*mmf.pfn_lwl)(wParam, lParam); break; case AfxSig_lwwM: lResult = (this->*mmf.pfn_lwwM)((UINT)LOWORD(wParam), (UINT)HIWORD(wParam), (CMenu*)CMenu::FromHandle((HMENU)lParam)); break; case AfxSig_vv: (this->*mmf.pfn_vv)(); break; case AfxSig_vw: // AfxSig_vb, AfxSig_vh (this->*mmf.pfn_vw)(wParam); break; case AfxSig_vww: (this->*mmf.pfn_vww)((UINT)wParam, (UINT)lParam); break; case AfxSig_vvii: (this->*mmf.pfn_vvii)((short)LOWORD(lParam), (short)HIWORD(lParam)); break; case AfxSig_vwww: (this->*mmf.pfn_vwww)(wParam, LOWORD(lParam), HIWORD(lParam)); break; case AfxSig_vwii: (this->*mmf.pfn_vwii)(wParam, LOWORD(lParam), HIWORD(lParam)); break; . . .er verweist mich dabei auf die WINCORE.CPP
der genau stand ist das break nach dem dritten case
-
Hast du ein Hauptfenster, oder nur diese drei?
Falls du eines hast, wie sieht die MessageMap aus?
Falls nicht, wie sieht InitInstance aus?
Weist du m_pMainWnd irgendwo einen Wert zu?
-
Das Hauptfenster ist ein SDI-Projekt. DIe MessageMap habe ich leider nicht gefunden aber die InitInstancd sieht so aus:
// Standardinitialisierung // Wenn Sie diese Funktionen nicht nutzen und die Größe Ihrer fertigen // ausführbaren Datei reduzieren wollen, sollten Sie die nachfolgenden // spezifischen Initialisierungsroutinen, die Sie nicht benötigen, entfernen. // Ändern des Registrierungsschlüssels, unter dem unsere Einstellungen gespeichert sind. // ZU ERLEDIGEN: Sie sollten dieser Zeichenfolge einen geeigneten Inhalt geben // wie z.B. den Namen Ihrer Firma oder Organisation. SetRegistryKey(_T("Local AppWizard-Generated Applications")); LoadStdProfileSettings(); // Standard INI-Dateioptionen laden (einschließlich MRU) // Dokumentvorlagen der Anwendung registrieren. Dokumentvorlagen // dienen als Verbindung zwischen Dokumenten, Rahmenfenstern und Ansichten. CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate( IDR_MAINFRAME, RUNTIME_CLASS(CFirststepDoc), RUNTIME_CLASS(CMainFrame), // Haupt-SDI-Rahmenfenster RUNTIME_CLASS(CFirststepView)); AddDocTemplate(pDocTemplate); // Befehlszeile parsen, um zu prüfen auf Standard-Umgebungsbefehle DDE, Datei offen CCommandLineInfo cmdInfo; ParseCommandLine(cmdInfo); // Verteilung der in der Befehlszeile angegebenen Befehle if (!ProcessShellCommand(cmdInfo)) return FALSE; // Das einzige Fenster ist initialisiert und kann jetzt angezeigt und aktualisiert werden. m_pMainWnd->ShowWindow(SW_SHOW); m_pMainWnd->UpdateWindow(); if( ! DShowLib::InitLibrary( "IS-2090097660" ) ) { return FALSE; } else { return TRUE; }Über die Suchfunktion habe ich folgendes über m_pMainWnd gefunden:
C:\tmp\Kopie von Kopie von Firststep 0.3\Firststep.cpp(82): m_pMainWnd->ShowWindow(SW_SHOW); C:\tmp\Kopie von Kopie von Firststep 0.3\Firststep.cpp(83): m_pMainWnd->UpdateWindow(); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPCORE.CPP(393): if (m_pMainWnd == NULL && AfxOleGetUserCtrl()) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPCORE.CPP(396): TRACE0("Warning: m_pMainWnd is NULL in CWinApp::Run - quitting application.\n"); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPUI.CPP(28): ASSERT(m_pMainWnd != NULL); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPUI.CPP(29): m_pMainWnd->SendMessage(WM_CLOSE); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPUI.CPP(38): ASSERT_VALID(m_pMainWnd); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPUI.CPP(41): m_pMainWnd->ShowWindow(SW_HIDE); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPUI.CPP(42): m_pMainWnd->ShowOwnedPopups(FALSE); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPUI.CPP(45): m_pMainWnd->SetWindowPos(&CWnd::wndBottom, 0, 0, 0, 0, C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPUI2.CPP(33): if (m_pMainWnd == NULL) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\APPUI2.CPP(53): m_pMainWnd->SendMessage(WM_COMMAND, ID_FILE_PRINT_DIRECT); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\DBCORE.CPP(750): TRACE0("Error: No default window (AfxGetApp()->m_pMainWnd) for SQLDriverConnect.\n"); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\DOCMGR.CPP(689): CWnd* pMainWnd = AfxGetApp()->m_pMainWnd; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\DOCMGR.CPP(786): AfxGetApp()->m_pMainWnd->SendMessage(WM_COMMAND, ID_FILE_PRINT_DIRECT); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\DOCMGR.CPP(795): AfxGetApp()->m_pMainWnd->PostMessage(WM_CLOSE); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\DOCMGR.CPP(933): if (pFrame != (pAppFrame = (CFrameWnd*)AfxGetApp()->m_pMainWnd)) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\DOCSINGL.CPP(198): if (bCreated && pThread->m_pMainWnd == NULL) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\DOCSINGL.CPP(201): pThread->m_pMainWnd = pFrame; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\OLELOCK.CPP(38): if (pApp != NULL && pApp->m_pMainWnd != NULL) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\OLELOCK.CPP(41): if (pApp->m_pMainWnd->IsWindowEnabled()) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\OLELOCK.CPP(44): pApp->m_pMainWnd->DestroyWindow(); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\OLELOCK.CPP(87): (pApp == NULL || pApp->m_pMainWnd == NULL || C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\OLELOCK.CPP(88): !pApp->m_pMainWnd->IsWindowVisible())) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\OLESVR1.CPP(782): else if (pApp->m_pMainWnd != NULL) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\OLESVR1.CPP(873): CFrameWnd* pMainFrame = (CFrameWnd*)pApp->m_pMainWnd; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(75): pThread->m_pMainWnd == NULL && pApp->m_pMainWnd->GetSafeHwnd() != NULL) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(78): threadWnd.Attach(pApp->m_pMainWnd->m_hWnd); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(79): pThread->m_pMainWnd = &threadWnd; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(342): m_pMainWnd = NULL; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(548): CWnd* pMainWnd = m_pMainWnd; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(761): if ((m_pMainWnd != NULL) && (IsEnterKey(lpMsg) || IsButtonUp(lpMsg))) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(800):// Access to m_pMainWnd & m_pActiveWnd C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(808): if (m_pMainWnd != NULL) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(809): return m_pMainWnd; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\THRDCORE.CPP(876): dc << "\nm_pMainWnd = " << m_pMainWnd; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\VIEWPREV.CPP(750): CWnd* pMainWnd = AfxGetThread()->m_pMainWnd; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\VIEWPREV.CPP(892): CFrameWnd* pParent = (CFrameWnd*)AfxGetThread()->m_pMainWnd; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINCORE.CPP(785): if (pThread->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINCORE.CPP(793): pThread->m_pMainWnd = NULL; C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINCORE.CPP(2841): if (pApp != NULL && pApp->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINCORE.CPP(2850): if (AfxGetThread() != NULL && AfxGetThread()->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINCORE.CPP(2879): if (AfxGetThread() != NULL && AfxGetThread()->m_pMainWnd == this && C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINCORE.CPP(2905): if (AfxGetThread() != NULL && AfxGetThread()->m_pMainWnd == this && C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINCORE.CPP(2919): if (pApp != NULL && pApp->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINFRM.CPP(760): if (pApp != NULL && pApp->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINFRM.CPP(792): if (pApp != NULL && pApp->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINFRM.CPP(817): if (!afxContextIsDLL && pApp->m_pMainWnd == NULL) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINFRM.CPP(867): if (pApp != NULL && pApp->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINFRM.CPP(948): if (AfxGetThread()->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINFRM.CPP(1072): if (pApp != NULL && pApp->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINFRM.CPP(1085): if (pApp != NULL && pApp->m_pMainWnd == this) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINMAIN.CPP(41): if (pThread->m_pMainWnd != NULL) C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINMAIN.CPP(43): TRACE0("Warning: Destroying non-NULL m_pMainWnd\n"); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINMAIN.CPP(44): pThread->m_pMainWnd->DestroyWindow(); C:\Programme\Microsoft Visual Studio\VC98\MFC\SRC\WINMDI.CPP(508): CWnd* pMainWnd = AfxGetThread()->m_pMainWnd; C:\Programme\Microsoft Visual Studio\VC98\MFC\INCLUDE\AFXWIN.H(3802): CWnd* m_pMainWnd; // main window (usually same AfxGetApp()->m_pMainWnd) C:\Programme\Microsoft Visual Studio\VC98\MFC\INCLUDE\AFXWIN.H(3803): CWnd* m_pActiveWnd; // active main window (may not be m_pMainWnd) C:\Programme\Microsoft Visual Studio\VC98\MFC\INCLUDE\AFXWIN.H(3839): // Advanced: virtual access to m_pMainWnd Es wurde(n) 59 Übereinstimmung(en) gefunden.
-
OK, an m_pMainWnd liegt es nicht. Aber irgendwas geht schief beim Aufruf der Behandlungsfunktion für WM_PAINT.
Wie erstellst du die Dialoge?
Hast du irgendwelche OnPaint-Methoden überschrieben?
Kannst du anhand des ersten Parameters von AfxCallWndProc erkennen, um welches der Fenster es sich handelt?
-
Die Dialogfeldfenster erstelle ich wiefolgt:
m_rotdlg.DestroyWindow(); // schutz vor doppelaufruf m_rotdlg.Create(IDD_rot); m_rotdlg.ShowWindow(SW_SHOW); m_rotdlg.OnPaint(Rot); m_blaudlg.DestroyWindow(); // schutz vor doppelaufruf m_blaudlg.Create(IDD_blau); m_blaudlg.ShowWindow(SW_SHOW); m_blaudlg.OnPaint(Blau); m_gruendlg.DestroyWindow(); // schutz vor doppelaufruf m_gruendlg.Create(IDD_gruen); m_gruendlg.ShowWindow(SW_SHOW); m_gruendlg.OnPaint(Gruen);dann sieht die OnPaint anhand des Beispiels für rot so aus:
void rotdlg::OnPaint(unsigned char prot[PICX][PICY]) { int x=0,y=0; CPaintDC dc(this); // device context for painting HDC hdc=dc.GetSafeHdc(); for(x=0;x<640;x++) { for(y=0;y<480;y++) { dc.SetPixel(x+10,y+10,RGB(prot[x][y],prot[x][y],prot[x][y])); } } // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen // Kein Aufruf von CDialog::OnPaint() für Zeichnungsnachrichten }und die OnMove so:
oid rotdlg::OnMove(void) { //CDialog::OnMove(x, y); AfxMessageBox("MOVE"); int x=0,y=0; CPaintDC dc(this); // device context for painting HDC hdc=dc.GetSafeHdc(); for(x=0;x<640;x++) { for(y=0;y<480;y++) { dc.SetPixel(x+10,y+10,RGB(Rot[x][y],Rot[x][y],Rot[x][y])); } } }und die OnSize:
void rotdlg::OnSize(UINT nType, int cx, int cy) { AfxMessageBox("SIZE"); int x=0,y=0; CDialog::OnSize(nType, cx, cy); CPaintDC dc(this); // device context for painting HDC hdc=dc.GetSafeHdc(); for(x=0;x<640;x++) { for(y=0;y<480;y++) { dc.SetPixel(x+10,y+10,RGB(Rot[x][y],Rot[x][y],Rot[x][y])); } } // TODO: Code für die Behandlungsroutine für Nachrichten hier einfügen }
-
Mach den Parameter bei OnPaint weg.
-
Das war der Fehler
Nur wie komme ich dann an die Bilddaten die in der Klasse View stehen und ich in den Klassen Rot,Gruen und Blau brauche? dann muss ich die mir erstmal mit extern übergeben lassen oder?
-
blind schrieb:
dann muss ich mir aber wie dekomme ich die Bilddaten dann in die Klass rot von der View klasse?
Du rufst doch nicht etwa die OnPaint-Methoden der Dialoge aus der View-Klasse auf?

Du könntest der View-Klasse eine Methode verpassen, die die Bilddaten liefert.
Du könntest den Dialogklassen eine weitere Methode verpassen, mit der du die Bilddaten übergibst.
etc...Jedenfalls kannst du einer Nachrichtenbehandlungsfunktion nicht einfach weitere Parameter verpassen!