Zum Inhalt springen

Nase voll! SHFileOperation()


Narf!

Empfohlene Beiträge

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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, ...
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...