Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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.

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.

  • Autor

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.

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?

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, ...
  • Autor

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.

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.
  • Autor

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()

  • Autor

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?

  • Autor

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.

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

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.