Nach Migration auf VS 2017: LoadToolBar(..) hat einen Haltepunkt ausgelöst


  • Mod

    Bzgl RC-Invoke Alles!

    Bzgl. CToolBar::CreateWindowEx. Nö. Dort wird nicht SetBitmap aufgerufen?
    Meines Erachtens wird CToolBar::SetBitmap in der ganzen MFC nicht aufgerufen...

    Ersetze diese Bitmap, mal mit einer Standard 16 Farben Bitmap!



  • Stimmt!
    Ich bin in der Zeile verrutscht.
    Es wird "CToolBar::AddReplaceBitmap(..)", Zeile 433 in bartool.cpp,
    Anweisung: "VERIFY(::GetObject(hbmImageWell, sizeof(BITMAP), &bitmap));"
    aufgerufen.
    Und "hbmImageWell" ist NULL.

    RC2247:
    Aber leider hat das "#ifndef RC_INVOKED" in der StdAfx.h nicht geholfen,
    den Resource-Editor dazu zu bringen, die .rc-Datei zu öffnen.

    Zu lange Namen, Bezeichner, Pfade,... gehören in die Zeit von MS-DOS 1985,
    aber nicht in 2017.


  • Mod

    Du musst herausfinden welche include Datei es ist...



  • ... dann muss ich das wohl aufgeben.
    oder auf ein funktionierendes Visual Studio warten ...

    .. zumal das momentan nicht der Fehler ist, der meine Arbeit blockiert.

    Trotzdem vielen Dank


  • Mod

    elmut19 schrieb:

    ... dann muss ich das wohl aufgeben.
    oder auf ein funktionierendes Visual Studio warten ...

    .. zumal das momentan nicht der Fehler ist, der meine Arbeit blockiert.

    Also ich hatte noch nie solche Probleme. Sende mir doch mal dein RC Datei und die resource.h, wenn das kein Geheimnis ist.



  • Vielen Dank, Martin.
    Das Angebot nehme ich gerne an.



  • Zumindest das RC2247 Problem der Migration wäre nun gelöst.

    Martin war so hilfsbereit, sich die Resource-Dateien anzusehen.
    Dabei hatte er bemerkt, dass es in meinem Projekt eine Datei

    "newres.h" ( bei mir seit 2004 vorhanden und unverändert ) gibt.

    Diese enthielt nur einige "#define" Anweisungen, die allerdings in den neuen Visual Studios schon integriert sind.
    Ich habe die "#include"´s auf diese Datei aus meiner ".rc" Datei rausgenommen und kann den Resource Editor nun im VS2017 öffnen.

    Und Dank VS2017 sind die guten alten Zeiten wieder zurück, wo man während des
    Build-Vorgangs mal kurz zum Einkaufen gehen konnte! (gegenüber VS2005)

    Und die ToolBar zickt im Debugger immernoch rum.

    Danke nochmal
    Grüsse Helmut


  • Mod

    Callstack von dem ToolBar Problem bitte mal... 😉



  • Der Callstack vom ersten Halt der Toolbar:

    > mfc140ud.dll!CToolBar::AddReplaceBitmap(HBITMAP__ * hbmImageWell) Zeile 433 C++ Nichtbenutzercode. Symbole wurden geladen.
    mfc140ud.dll!CToolBar::LoadBitmapW(const wchar_t * lpszResourceName) Zeile 407 C++ Nichtbenutzercode. Symbole wurden geladen.
    mfc140ud.dll!CToolBar::LoadToolBar(const wchar_t * lpszResourceName) Zeile 382 C++ Nichtbenutzercode. Symbole wurden geladen.
    mfc140ud.dll!CToolBar::LoadToolBar(unsigned int nIDResource) Zeile 98 C++ Nichtbenutzercode. Symbole wurden geladen.
    Titan2.exe!CMainFrame::CreateToolBar(int bOldDesign) Zeile 166 C++ Symbole wurden geladen.
    Titan2.exe!CMainFrame::OnCreate(tagCREATESTRUCTW * lpCreateStruct) Zeile 272 C++ Symbole wurden geladen.
    [Externer Code] Frame mit Anmerkungen
    Titan2.exe!CTitanCeApp::InitInstance() Zeile 642 C++ Symbole wurden geladen.
    [Externer Code] Frame mit Anmerkungen
    Titan2.exe!wWinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, wchar_t * lpCmdLine, int nCmdShow) Zeile 26 C++ Symbole wurden geladen.
    [Externer Code] Frame mit Anmerkungen

    Dann klicke ich im Debugger auf weiter.
    Dann kommt gleich nochmal ein solcher Halt:

    > mfc140ud.dll!CToolBar::AddReplaceBitmap(HBITMAP__ * hbmImageWell) Zeile 433 C++ Nichtbenutzercode. Symbole wurden geladen.
    mfc140ud.dll!CToolBar::LoadBitmapW(const wchar_t * lpszResourceName) Zeile 407 C++ Nichtbenutzercode. Symbole wurden geladen.
    mfc140ud.dll!CToolBar::LoadToolBar(const wchar_t * lpszResourceName) Zeile 382 C++ Nichtbenutzercode. Symbole wurden geladen.
    mfc140ud.dll!CToolBar::LoadToolBar(unsigned int nIDResource) Zeile 98 C++ Nichtbenutzercode. Symbole wurden geladen.
    Titan2.exe!CMainFrame::LoadToolBar(int iToolBarNew, int iToolBarOld, int bIsOldDesign) Zeile 228 C++ Symbole wurden geladen.
    Titan2.exe!CTitanCeApp::SwitchToolbars(CBaseAnlage * pAnlage, CViewTitanCe * pView, int bBedingung, int bOldDesign, int bDoSwitch) Zeile 481 C++ Symbole wurden geladen.
    Titan2.exe!CTitanCeApp::On_Update_Buttons(CCmdUI * pCmdUI) Zeile 633 C++ Symbole wurden geladen.
    [Externer Code] Frame mit Anmerkungen
    Titan2.exe!CMainFrame::OnCmdMsg(unsigned int nID, int nCode, void * pExtra, AFX_CMDHANDLERINFO * pHandlerInfo) Zeile 486 C++ Symbole wurden geladen.
    [Externer Code] Frame mit Anmerkungen
    Titan2.exe!CTitanCeApp::UpdateToolbar() Zeile 953 C++ Symbole wurden geladen.
    [Externer Code] Frame mit Anmerkungen
    Titan2.exe!CMainFrame::OnCmdMsg(unsigned int nID, int nCode, void * pExtra, AFX_CMDHANDLERINFO * pHandlerInfo) Zeile 486 C++ Symbole wurden geladen.
    [Externer Code] Frame mit Anmerkungen
    Titan2.exe!CTitanCeApp::Run() Zeile 141 C++ Symbole wurden geladen.
    [Externer Code] Frame mit Anmerkungen
    Titan2.exe!wWinMain(HINSTANCE
    _ * hInstance, HINSTANCE__ * hPrevInstance, wchar_t * lpCmdLine, int nCmdShow) Zeile 26 C++ Symbole wurden geladen.
    [Externer Code] Frame mit Anmerkungen

    Ebenfalls wieder auf "Weiter" und in der Anwendung über Toolbar-Button die nächste Programmebene anwählen:

    > mfc140ud.dll!CToolBar::AddReplaceBitmap(HBITMAP__ * hbmImageWell) Zeile 433 C++ Nichtbenutzercode. Symbole wurden geladen.
    mfc140ud.dll!CToolBar::LoadBitmapW(const wchar_t * lpszResourceName) Zeile 407 C++ Nichtbenutzercode. Symbole wurden geladen.
    mfc140ud.dll!CToolBar::LoadToolBar(const wchar_t * lpszResourceName) Zeile 382 C++ Nichtbenutzercode. Symbole wurden geladen.
    mfc140ud.dll!CToolBar::LoadToolBar(unsigned int nIDResource) Zeile 98 C++ Nichtbenutzercode. Symbole wurden geladen.
    Titan2.exe!CMainFrame::LoadToolBar(int iToolBarNew, int iToolBarOld, int bIsOldDesign) Zeile 228 C++ Symbole wurden geladen.
    Titan2.exe!CTitanCeApp::Liste(unsigned short wWas, unsigned short wSelectPos, unsigned short wLogSelect) Zeile 703 C++ Symbole wurden geladen.
    Titan2.exe!CTitanCeApp::GrafikReadVerzeichnisAuswahl(int bIncludeBackup, int bGrafikArchivAktiv, int bComesFromEinstellungen) Zeile 1822 C++ Symbole wurden geladen.
    Titan2.exe!CTitanCeApp::Grafik(int bGrafikArchivAktiv) Zeile 2260 C++ Symbole wurden geladen.
    Titan2.exe!CTitanCeApp::BenutzerAbfrage_Grafik() Zeile 350 C++ Symbole wurden geladen.
    [Externer Code] Frame mit Anmerkungen
    Titan2.exe!CMainFrame::OnCmdMsg(unsigned int nID, int nCode, void * pExtra, AFX_CMDHANDLERINFO * pHandlerInfo) Zeile 486 C++ Symbole wurden geladen.
    [Externer Code] Frame mit Anmerkungen
    Titan2.exe!CBarTool::OnLButtonUp(unsigned int nFlags, CPoint point) Zeile 151 C++ Symbole wurden geladen.
    [Externer Code] Frame mit Anmerkungen
    Titan2.exe!CTitanCeApp::Run() Zeile 141 C++ Symbole wurden geladen.
    [Externer Code] Frame mit Anmerkungen
    Titan2.exe!wWinMain(HINSTANCE__ * hInstance, HINSTANCE__ * hPrevInstance, wchar_t * lpCmdLine, int nCmdShow) Zeile 26 C++ Symbole wurden geladen.
    [Externer Code] Frame mit Anmerkungen

    Und so geht das dann immer weiter.


  • Mod

    Dann trace mal in den ersten Fall rein, ab CreateToolBar.
    Da muss doch was fehlen, wenn AddReplaceBitmap einen ASSERT liefert!
    Mit der Bitmap stimmt dann doch was nicht...



  • Danke Martin,

    ich werde da nochmal genauer durchgehen.
    Ich werde vor allem versuchen, an der Stelle auf die neuen Microsoft Toolbar-Klassen zu wechseln.
    So kann ich auch unnötigen Code abbauen.
    Die neuen Klassen scheinen ja nun das zu können, was ich brauche.

    Momentan habe ich kurzzeitige eine andere Baustelle, die mich wohl noch
    den Grossteil dieser Woche in Anspruch nehmen wird.

    Vielen Dank nochmal für die Hilfe.
    Es hat mich um Einiges weitergebracht.
    Grüsse
    Helmut



  • Ich habe nochmals nachgesehen.
    Habe auch den Grund für diesen Haltepunkt gefunden, der tatsächlich gar kein Fehler ist.

    Allerdings weiss ich nicht, wie man das lösen kann.

    Folgendes:
    Neues VS, also auch überarbeitete Systemfunktionen.
    Und über den Aufruf von LoadToolBar(..) kommt man auch bald in das MFC-Zeugs.

    In der Datei bartool.cpp gibt es die Function AfxLoadSysColorBitmap(..).
    Diese hat sich geändert!

    Alt (VS2005):

    HBITMAP AFXAPI
    AfxLoadSysColorBitmap(HINSTANCE hInst, HRSRC hRsrc, BOOL bMono)
    {
    	HGLOBAL hglb;
    	if ((hglb = LoadResource(hInst, hRsrc)) == NULL)
    		return NULL;
    
    	LPBITMAPINFOHEADER lpBitmap = (LPBITMAPINFOHEADER)LockResource(hglb);
    	if (lpBitmap == NULL)
    		return NULL;
    

    Neu (VS2017)

    HBITMAP AFXAPI
    AfxLoadSysColorBitmap(HINSTANCE hInst, HRSRC hRsrc, BOOL bMono)
    {
    	HGLOBAL hglb;
    	if ((hglb = LoadResource(hInst, hRsrc)) == NULL)
    	{
    		return NULL;
    	}
    
    	LPBITMAPINFOHEADER lpBitmap = (LPBITMAPINFOHEADER)LockResource(hglb);
    	if ((lpBitmap == NULL) || (lpBitmap->biBitCount > 8))
    	{
    		return NULL;    // Hier ist dann Schluss
    	}
    

    Da meine Bitmaps nun mal 24 Bit benötigen, steigt mein Programm an dieser Stelle mit der Abfrage auf 8 Bit aus!

    Wie schitzophren sind die denn bei MS?
    Nun kann man endlich die Toolbars in 24 Bit Farbtiefe bearbeiten.
    aber man darf sie nicht verwenden!
    Zumindest nicht in der CToolBar-Klasse.

    Oder hat man bei MS vielleicht durch irgend welche Aufruf Parameter doch die Möglichkeit geschaffen,
    den TrueColor Mode anzugeben? Im Create(..) vielleicht?

    Vielleicht weiss da jemand Rat?

    Grüsse
    Helmut


Anmelden zum Antworten