Narf! Geschrieben 5. September 2003 Teilen Geschrieben 5. September 2003 Ich schmeiss es gleich in die Ecke!!! Beim Aufruf von SHFileOperation(&Op) fängt er an zu kopieren, aber sobald der Dialog dafür angezeigt werden soll, kommt eine große Fehlermeldung. Irgendwas mit wincore.cpp. Das Beste ist, es lief schon mal fehlerfrei und ich habe nichts daran geändert. Vorher erhielt ich eine Fehlermeldung bei UpdateData(false), Access Violation. Da habe ich UpdateData ersetzt durch GetDlgItem(IDC_STATIC_Fort)->SetWindowText(m_wFort) und das funktionierte dann, und jetzt das mit dem Kopieren. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 5. September 2003 Teilen Geschrieben 5. September 2003 Original geschrieben von Narf! ...kommt eine große Fehlermeldung. Irgendwas mit wincore.cpp.<Gebetsmühle> Fehlermeldungen sind für die Diagnose da, nicht zum Wegklicken! Also bitte genau angeben, was da stand. </Gebetsmühle> P.S.: Du kannst den Text einer MessageBox mit Strg-C in die Zwischenablage kopieren. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Narf! Geschrieben 5. September 2003 Autor Teilen Geschrieben 5. September 2003 Da steht: Debug Assertion Failed! Programm: [Mein Projekt.exe] File: wincore.cpp Line: 2092 For Information...usw. Mehr nicht. Ich habe auch Versucht eine MessageBox anzeigen zu lassen, die bringt er auch nicht. Kann das irgend wie mit dem Initialisieren des COM-Ports zusammenhängen? Weil vorher lief alles super. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 5. September 2003 Teilen Geschrieben 5. September 2003 Original geschrieben von Narf! File: wincore.cpp Line: 2092 Das ist in CWnd::OnCommand: BOOL CWnd::OnCommand(WPARAM wParam, LPARAM lParam) // return TRUE if command invocation was attempted { UINT nID = LOWORD(wParam); HWND hWndCtrl = (HWND)lParam; int nCode = HIWORD(wParam); // default routing for command messages (through closure table) if (hWndCtrl == NULL) { // zero IDs for normal commands are not allowed if (nID == 0) return FALSE; // make sure command has not become disabled before routing CTestCmdUI state; state.m_nID = nID; OnCmdMsg(nID, CN_UPDATE_COMMAND_UI, &state, NULL); if (!state.m_bEnabled) { TRACE1("Warning: not executing disabled command %d\n", nID); return TRUE; } // menu or accelerator nCode = CN_COMMAND; } else { // control notification [color=red]ASSERT(nID == 0 || ::IsWindow(hWndCtrl));[/color] [/CODE]Es kommt also eine Nachricht von einem Steuerelement, das kein gültiges Fenster (mehr) ist. [b]Kann das irgend wie mit dem Initialisieren des COM-Ports zusammenhängen?[/b]Nein. Kannst du das mal Debuggen, und den Callstack posten, wenn die Assertion auftritt? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Narf! Geschrieben 8. September 2003 Autor Teilen Geschrieben 8. September 2003 Was ist ein Callstack? Was ist eine Assertion? Dumme Fragen, ich weiß. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 8. September 2003 Teilen Geschrieben 8. September 2003 Original geschrieben von Narf! Was ist ein Callstack?In einem C/C++-Programm rufen immer wieder irgendwelche Funktionen andere Funktionen auf. Das beginnt beim Einsprungspunkt des Programms (main, Winmain, etc) und baut sich von dort aus auf. Irgendwann führt das bei deinem Programm zum Aufruf von CWnd::OnCommand. Der Callstack gibt nun wieder, durch welche anderen Funktionen hindurch es zu diesem Aufruf gekommen ist. Ganz oben auf dem Aufrufstapel steht CWnd::OnCommand, darunter steht die Funktion, die CWnd::OnCommand aufgerufen hat, darunter die Funktion, die die darüber aufgerufen hat usw. Über den Callstack lässt sich möglicherweise darauf schließen, was den Fehler verursacht. MSVC kann den Callstack anzeigen, wenn ein "gedebugtes" Programm angehalten ist (durch Breakpoint oder auch Assertion). Was ist eine Assertion?Eine Assertion ist eine Prüfung von etwas, das eigentlich nicht fehlschlagen darf. Man baut so etwas ein, um Programmierfehler zu finden. Ein Debug-Build bricht mit der bekannten Fehlermeldung ab, wenn eine Assertion fehlschlägt, bei einem Release-Build wird die Prüfung aus dem Programm entfernt. In deinem Fall bedeutet die Zeile ASSERT(nID == 0 || ::IsWindow(hWndCtrl)); dass das Programm prüft, on nId Null ist ODER hWndCtrl ein gültiges Fensterhandle ist. Wenn beides nicht zutrifft, bricht das Programm ab. Dumme Fragen, ich weiß. Es gibt keine dummen Fragen. Wer nicht fragt, ... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Narf! Geschrieben 8. September 2003 Autor Teilen Geschrieben 8. September 2003 Ich stehe jetzt mit dem Haltepunkt bei SHFileOperation(&Op): CCDCopy2Dlg::OnBUTTON1Cpy() line 288 _AfxDispatchCmdMsg(CCmdTarget * 0x0078fc60 {CCDCopy2Dlg hWnd=0x00000b00}, unsigned int 1004, int 0, void (void)* 0x0040107d CCDCopy2Dlg::OnBUTTON1Cpy(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 3144) line 2088 CWnd::OnWndMsg(unsigned int 273, unsigned int 1004, long 3144, long * 0x0078f7ec) line 1597 + 28 bytes CWnd::WindowProc(unsigned int 273, unsigned int 1004, long 3144) line 1585 + 30 bytes AfxCallWndProc(CWnd * 0x0078fc60 {CCDCopy2Dlg hWnd=0x00000b00}, HWND__ * 0x00000b00, unsigned int 273, unsigned int 1004, long 3144) line 215 + 26 bytes AfxWndProc(HWND__ * 0x00000b00, unsigned int 273, unsigned int 1004, long 3144) line 368 KERNEL32! bff7363b() KERNEL32! bff94407() Wenn ich jetzt F5 drücke passierts. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 8. September 2003 Teilen Geschrieben 8. September 2003 Original geschrieben von Narf! Wenn ich jetzt F5 drücke passierts. Wir brauchen den Callstack zum Zeitpunkt der fehlgeschlagenen Assertion. Wenn also die Assertion-Meldung kommt, klick auf Wiederholen / Retry, dann sollte der Debugger auf dem ASSERT stehen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Narf! Geschrieben 8. September 2003 Autor Teilen Geschrieben 8. September 2003 CWnd::GetSafeHwnd() line 23 + 27 bytes CWnd::Create(const char * 0x00000087, const char * 0x00000000, unsigned long 0, const tagRECT & {top=135 bottom=0 left=3892 right=0}, CWnd * 0x0000848e {CWnd hWnd=???}, unsigned int 7922794, CCreateContext * 0x0000848e) line 742 + 16 bytes AfxCallWndProc(CWnd * 0x0078fcd4 { hWnd=???}, HWND__ * 0x00000f34, unsigned int 135, unsigned int 0, long 0) line 215 + 26 bytes AfxWndProc(HWND__ * 0x00000f34, unsigned int 135, unsigned int 0, long 0) line 368 KERNEL32! bff7363b() KERNEL32! bff94407() Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 8. September 2003 Teilen Geschrieben 8. September 2003 Original geschrieben von Narf! CWnd::GetSafeHwnd() line 23 + 27 bytes Das ist nicht die gleiche Stelle, an der die erste Assertion fehlschlug. In welcher Datei und Zeile steht der Debugger? Ist das der gesamte Callstack? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Narf! Geschrieben 8. September 2003 Autor Teilen Geschrieben 8. September 2003 Ich habe bei der Struktur das Flag FOF_SIMPLEPROGRESS und die Zeile Op.lpszProgressTitle="Kopiere CD..." weggelassen. Jetzt kommt das ganze beim Beenden des Programms. Die Datei wincore.cpp wird geöffnet und der gelbe Pfeil steht bei: #ifdef _DEBUG ASSERT(pMap->LookupPermanent(hWndOrig) == NULL); Das Stack beinhaltet: CWnd::DestroyWindow() line 980 + 35 bytes CComboBox::~CComboBox() line 179 CCDCopy2Dlg::~CCDCopy2Dlg() + 158 bytes CCDCopy2App::InitInstance() line 65 + 28 bytes AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x817931e0, int 1) line 39 + 11 bytes WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x817931e0, int 1) line 30 WinMainCRTStartup() line 198 + 54 bytes KERNEL32! bff8b560() KERNEL32! bff8b412() KERNEL32! bff89dd5() Das Problem tritt auch nur auf, wenn ich kopiere. Nachdem der Kopiervorgang abgeschlossen ist, wird auch wieder eine MessageBox ohne Fehlermeldung angezeigt. Wenn ich das Programm aufrufe und gleich wieder beende, passiert nichts. Liegt es vielleicht an der Variable m_hWnd? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 8. September 2003 Teilen Geschrieben 8. September 2003 Startest du irgendwo einen zweiten Thread? Öffnet oder schließt dieser Thread irgendwelche Fenster? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Narf! Geschrieben 8. September 2003 Autor Teilen Geschrieben 8. September 2003 Nein, ich habe keine Threads. Mit diesem Thema will ich mich später mal beschäftigen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Narf! Geschrieben 10. September 2003 Autor Teilen Geschrieben 10. September 2003 Mir ist noch was aufgefallen: Wenn sich der Dialog vom Kopieren schließt, zeigt es meinen Programmdialog unvollständig an und die letzte Messagebox, die das Ende des Vorgangs meldet, wird nicht angezeigt. Wenn der Kopierdialog angezeigt wird, verliert der Programmdialog seinen Fokus und erhält ihn auch nicht zurück. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 10. September 2003 Teilen Geschrieben 10. September 2003 Wenn du möchtest, kannst du mir das Projekt schicken, dann schau ich mal drüber. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Narf! Geschrieben 11. September 2003 Autor Teilen Geschrieben 11. September 2003 Es muss am Wetter liegen! :confused: Ich habe das gesamte Projekt in ein neues kopiert und... es funktioniert ohne Fehler. Poink! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
ITSE Geschrieben 15. September 2003 Teilen Geschrieben 15. September 2003 Manchmal liegt es einfach nur daran, dass nach irgendwelchen Änderungen (und seien sie noch so marginal) ein einfaches kompilieren nicht mehr ausreicht... Das Programm stürzt dann einfach so ab... unvorhersehbar und für den Programmierer nicht nachvollziehbar. Das liegt am Compiler, der anscheinend ab und zu vergisst bei bestimmten Codeänderungen alle nötigen Codeteile neu zu compilieren oder so was ähnliches und dann bestimmte Einsprungadressen unkorrekt sind. In diesen Fällen hilft bei VC++6 die Option "Alles neu erstellen" aus dem Pull-Down-Menü.... Wirkt manchmal Wunder cya Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.