Immer noch Access Violation
-
GdiPlusStartup hab ich aufgerufen! Ich kann auch mit den GDI+ Funktionen zeichnen aber es gibt diesen Access Violation wenn ich die Funktion mehrmals aufrufe und dass Programm stürzt irgendwann dann komplett ab.
-
Wo tritt denn die Access Violation auf? In deinem Code? Im GDI+-Code? Was sagt der Debugger?
-
Die Access Violation tritt in meinem Code auf, genau hier:
Graphics graphics(pdc->m_hDC);
-
Habt ihr keine Ahnung wie ich das hinbekomme? Dieser Fehler nervt mich wirklich!

-
Slayer schrieb:
Die Access Violation tritt in meinem Code auf, genau hier:
Graphics graphics(pdc->m_hDC);Das kann ja eigentlich nur passieren, wenn pdc ungültig ist. Welchen Wert hat denn pdc?
-
Ich glaub daran liegts nicht, da ich auch schon mit
if(pdc) { ... }versucht habe den Fehler einzugrenzen.
Der Debugger gibt mir übrigens folgenden Fehler aus:
Nicht abgefangene Ausnahme in Test2.exe (GDI32.DLL): 0xC0000005: Access Violation.
Und die Disassemblierung markiert folgendes: BFF24DD5 mov ax,word ptr gs:[ecx]
Vielleicht hilft das den Fehler zu bestimmen?
-
Slayer schrieb:
Ich glaub daran liegts nicht
Wir sind hier nicht in der Kirche

Welchen Wert hat pdc konkret, wenn die Access Violation auftritt?
Der Debugger gibt mir übrigens folgenden Fehler aus:
Nicht abgefangene Ausnahme in Test2.exe (GDI32.DLL): 0xC0000005: Access Violation.
Und die Disassemblierung markiert folgendes: BFF24DD5 mov ax,word ptr gs:[ecx]Wie sieht der Callstack aus?
-
Wie kann ich denn den Callstack auslesen? Und was soll der überhaupt sein?
-
Ach ja pdc hat den Wert: 0x00992960
-
Slayer schrieb:
Ach ja pdc hat den Wert: 0x00992960
Und welchen Wert hat pdc->m_hDC?
Slayer schrieb:
Wie kann ich denn den Callstack auslesen? Und was soll der überhaupt sein?
Der Callstack ("Aufrufstapel") zeigt, welche Funktion welche andere Funktion aufgerufen hat. Dadurch lässt sich nachvollziehen, welchen Weg das Programm bis zu dem Fehler genommen hat. MSVC kann den Callstack im Debugger anzeigen.
-
pdc->m_hDC hat den Wert: 0x00000772
-
Und der Callstack sieht folgendermaßen aus:
CTest2Doc::DrawFunc(CString {"+1x^2"}, unsigned long 0) line 112
CEditF::OnDrawfunc() line 67
_AfxDispatchCmdMsg(CCmdTarget * 0x00991730 {CEditF}, unsigned int 1002, int 0, void (void)* 0x0040118b CEditF::OnDrawfunc(void), void * 0x00000000, unsigned int 12, AFX_CMDHANDLERINFO * 0x00000000) line 88
CCmdTarget::OnCmdMsg(unsigned int 1002, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 302 + 39 bytes
CDialog::OnCmdMsg(unsigned int 1002, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 97 + 24 bytes
CWnd::OnCommand(unsigned int 1002, long 2368) line 2088
CWnd::OnWndMsg(unsigned int 273, unsigned int 1002, long 2368, long * 0x0065f988) line 1597 + 28 bytes
CWnd::WindowProc(unsigned int 273, unsigned int 1002, long 2368) line 1585 + 30 bytes
AfxCallWndProc(CWnd * 0x00991730 {CEditF hWnd=???}, HWND__ * 0x00000934, unsigned int 273, unsigned int 1002, long 2368) line 215 + 26 bytes
AfxWndProc(HWND__ * 0x00000934, unsigned int 273, unsigned int 1002, long 2368) line 368
AfxWndProcBase(HWND__ * 0x00000934, unsigned int 273, unsigned int 1002, long 2368) line 220 + 21 bytes
-
Ist das der Callstack zum Zeitpunkt der Access Violation, oder hast du einen Breakpoint auf deine Zeile gesetzt?
-
Hier noch mal der Callstack wenn es die Access Violation gibt (bei Haltepunkt nach Graphics, was ja die Access Violation verursacht):
CTest2Doc::DrawFunc(CString {"+1x^2"}, unsigned long 0) line 112
CEditF::OnDrawfunc() line 67
_AfxDispatchCmdMsg(CCmdTarget * 0x00991730 {CEditF}, unsigned int 1002, int 0, void (void)* 0x00401195 CEditF::OnDrawfunc(void), void * 0x00000000, unsigned int 12, AFX_CMDHANDLERINFO * 0x00000000) line 88
CCmdTarget::OnCmdMsg(unsigned int 1002, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 302 + 39 bytes
CDialog::OnCmdMsg(unsigned int 1002, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 97 + 24 bytes
CWnd::OnCommand(unsigned int 1002, long 1492) line 2088
CWnd::OnWndMsg(unsigned int 273, unsigned int 1002, long 1492, long * 0x0065f988) line 1597 + 28 bytes
CWnd::WindowProc(unsigned int 273, unsigned int 1002, long 1492) line 1585 + 30 bytes
AfxCallWndProc(CWnd * 0x00991730 {CEditF hWnd=???}, HWND__ * 0x000005c8, unsigned int 273, unsigned int 1002, long 1492) line 215 + 26 bytes
AfxWndProc(HWND__ * 0x000005c8, unsigned int 273, unsigned int 1002, long 1492) line 368
AfxWndProcBase(HWND__ * 0x000005c8, unsigned int 273, unsigned int 1002, long 1492) line 220 + 21 bytesDer Callstack den ich vorher gepostet hab ist genau bei der Zeile in der es die Access Violation gibt.
Kannst du mir helfen?
-
Slayer schrieb:
Der Callstack den ich vorher gepostet hab ist genau bei der Zeile in der es die Access Violation gibt.
Kannst du mir helfen?
Es bringt nichts, wenn du hier Callstacks von irgendwelchen Breakpoints in deinem Code zeigst. Mach die Breakpoints weg, lass das Programm laufen, und wenn die Messagebox mit der Access Violation kommt, klick auf Wiederholen. Dann steht der Debugger wirklich dort, wo die Access Violation auftritt.
-
Sorry, das hier ist jetzt da wo die Access Violation auftritt

GDI32! bff24dd5()
KERNEL32! bff958f8()
GDIPLUS! 70d02833()
Gdiplus::Graphics::Graphics(HDC__ * 0x00000776) line 61 + 13 bytes
CTest2Doc::DrawFunc(CString {"+1x^2"}, unsigned long 0) line 124 + 15 bytes
CEditF::OnDrawfunc() line 67
CEditF::RedrawFunc() line 110
CDrawOpt::OnZoomIn() line 63
_AfxDispatchCmdMsg(CCmdTarget * 0x00991810 {CDrawOpt}, unsigned int 1004, int 0, void (void)* 0x00401177 CDrawOpt::OnZoomIn(void), void * 0x00000000, unsigned int 12, AFX_CMDHANDLERINFO * 0x00000000) line 88
CCmdTarget::OnCmdMsg(unsigned int 1004, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 302 + 39 bytes
CDialog::OnCmdMsg(unsigned int 1004, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 97 + 24 bytes
CWnd::OnCommand(unsigned int 1004, long 2004) line 2088
CWnd::OnWndMsg(unsigned int 273, unsigned int 1004, long 2004, long * 0x0065f988) line 1597 + 28 bytes
CWnd::WindowProc(unsigned int 273, unsigned int 1004, long 2004) line 1585 + 30 bytes
AfxCallWndProc(CWnd * 0x00991810 {CDrawOpt hWnd=???}, HWND__ * 0x000007d0, unsigned int 273, unsigned int 1004, long 2004) line 215 + 26 bytes
AfxWndProc(HWND__ * 0x000007d0, unsigned int 273, unsigned int 1004, long 2004) line 368
AfxWndProcBase(HWND__ * 0x000007d0, unsigned int 273, unsigned int 1004, long 2004) line 220 + 21 bytesKannst du mir jetzt helfen?
-
Kannst du mal GetDC zeigen?
-
Wie meinst du das? Den Rückgabewert oder was?
-
Vergiss es, hatte vergessen, dass das eine MFC-Funktion ist.
Passiert das eigentlich direkt beim ersten Aufruf, oder geht das ein paarmal gut?
-
Manchmal geht es ein paar Mal gut und der Fehler kommt bei jedem 3. Aufruf, manchmal kommt der Fehler jedes Mal! Kannst du mir helfen?