none
Absturz in CMFCToolBarsCustomizeDialog::Create RRS feed

  • Frage

  • Ein komisches Phänomen ist bei mir aufgetreten: Wenn ich den "Customize"-Dialog des MFC Feature Packs aufrufen möchte, bekomme ich in der Create-Methode einen Absturz. Der Code sieht folgendermaßen aus:

    CMFCToolBarsCustomizeDialog* pDlgCust
     = new CMFCToolBarsCustomizeDialog( this, TRUE /* Menüs überprüfen */ );
    pDlgCust->EnableUserDefinedToolbars();
    pDlgCust->Create();
    
    

    Das passiert auf einem Rechner mit englischen Visual Studio 2010 Prof. und Service Pack 1 Beta. Auf einem Rechner mit deutschem Studio ohne das Service Pack ist alles in Ordnung, d.h. es gibt keinen Absturz und der Dialog funktioniert wie gewünscht. Ich habe das mit verschiedenen Beispielen ausprobiert. Verfolgt man den CallStack, dann sieht man, dass er bis zur Methode DestroyPropertySheetPage() in der comctl32.dll reicht. Das Verhalten ist bei XP und Windows 7 identisch. Leider habe ich zu diesem Punkt im Internet noch nichts gefunden.


    Christoph Hermanns, Nürnberg
    Donnerstag, 10. Februar 2011 13:24

Antworten

  • Auch wenn der Thread nun schon etwas älter ist, möchte ich nur kurz mitteilen, dass sich das Problem mit der Installation des SP1 gelöst hat. Ich vermute, dass meine Installation die Probleme verursacht hat. Trotzdem vielen Dank für die Hilfe, Martin.


    Christoph Hermanns, Nürnberg
    Dienstag, 5. April 2011 14:50

Alle Antworten

  • Bekommst Du den Crash nur im Debugger, oder auch so?

    Evtl. ist es eine Exception, die normalerweise von Windows behandelt wird. Da gibt es im Property-Sheet Management einige.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Donnerstag, 10. Februar 2011 13:41
    Moderator
  • Leider kommt der Absturz immer. Es handelt sich um eine "unbehandelte Win32-Ausnahme". In der Methode PropertySheet::OnInitDialog() wird CWnd::Default() aufgerufen. Diese scheitert dann in CWnd::DefWindowProc... Auf diesem Rechner hat das übrigens auch mal funktioniert. Die damals erstellte Release Version des Programms stürzt an dieser Stelle nun aber auch ab. Und in diesem Programm wurde nur der vom Anwendungsassistenten erzeugte Code verwendet. Ich denke, dass das seit der Installation des Service Packs nicht mehr funktioniert. Ich kann das aber nicht 100%ig sagen...
    Christoph Hermanns, Nürnberg
    Donnerstag, 10. Februar 2011 14:15
  • Hast Du DEP auf diesem Rechner aktiviert?
    Führst Du selbst ein eigenes Subclassing durch?


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Donnerstag, 10. Februar 2011 14:29
    Moderator
  • Das geht ja schneller als die Feuerwehr in diesem Forum! DEP war aktiviert. Ich hab's testweise für die Anwendung mal deaktiviert. Hat aber keine Auswirkung gehabt. Subclassing verwende ich in diesem Projekt nicht.
    Christoph Hermanns, Nürnberg
    Donnerstag, 10. Februar 2011 14:58
  • Hmmm. Kannst Du im Debugger mal den genauen Callstack ansehen.

    Welche nachricht wird in dem Moment von CWnd::DefWindowProc behandelt?


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Donnerstag, 10. Februar 2011 15:20
    Moderator
  • Die Nachricht hat den Wert nMsg==272. Der Callstack sieht folgendermaßen aus:

     comctl32.dll!DllInstall()  + 0x1671 Bytes 
      [Unten angegebene Rahmen sind möglicherweise nicht korrekt und/oder fehlen, keine Symbole geladen für comctl32.dll] 
    > comctl32.dll!DestroyPropertySheetPage()  + 0xd1 Bytes 
      comctl32.dll!DestroyPropertySheetPage()  + 0x1d4 Bytes 
      comctl32.dll!CreatePropertySheetPage()  + 0x20f1 Bytes 
      comctl32.dll!CreatePropertySheetPage()  + 0x3c95 Bytes 
      comctl32.dll!CreatePropertySheetPage()  + 0x4825 Bytes 
      user32.dll!GetDC()  + 0x6d Bytes 
      user32.dll!DefDlgProcW()  + 0x402 Bytes 
      user32.dll!EnumDisplaySettingsA()  + 0xc9 Bytes 
      user32.dll!DefDlgProcW()  + 0x22 Bytes 
      user32.dll!GetDC()  + 0x6d Bytes 
      user32.dll!GetDC()  + 0x14f Bytes 
      user32.dll!IsWindowUnicode()  + 0xa1 Bytes 
      user32.dll!CallWindowProcW()  + 0x1b Bytes 
      mfc100ud.dll!CWnd::DefWindowProcW(unsigned int nMsg=272, unsigned int wParam=330860, long lParam=1662112)  Zeile 1089 + 0x20 Bytes C++
      mfc100ud.dll!CWnd::Default()  Zeile 291 C++
      mfc100ud.dll!CPropertySheet::OnInitDialog()  Zeile 1389 + 0x8 Bytes C++
      mfc100ud.dll!CMFCToolBarsCustomizeDialog::OnInitDialog()  Zeile 756 + 0xb Bytes C++

     


    Christoph Hermanns, Nürnberg
    Donnerstag, 10. Februar 2011 15:35
  • Hallo Christoph!

      comctl32.dll!DestroyPropertySheetPage()  + 0xd1 Bytes

    Das macht mich stutzig.
    Wenn das auch im Debugger passiert, schau mal in die Debug-Ausgabe.

    Kann es sein, das ein Control nicht richtiog erzeugt wird und das Property Sheet aus dem Grund zerstört wird (während der Erzeugung) ?


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Donnerstag, 10. Februar 2011 18:29
    Moderator
  • Auch wenn der Thread nun schon etwas älter ist, möchte ich nur kurz mitteilen, dass sich das Problem mit der Installation des SP1 gelöst hat. Ich vermute, dass meine Installation die Probleme verursacht hat. Trotzdem vielen Dank für die Hilfe, Martin.


    Christoph Hermanns, Nürnberg
    Dienstag, 5. April 2011 14:50