Mfc Projekt nach VS 2019 portieren



  • Hey,
    ein Thema erledigt und schon wieder 2 Probleme. Ich portiere ein MFC Projekt von VS 2010 auf VS 2019. Erstaunlicher Weise fast ohne Probleme mit den neuen Pfaden :).
    Aber :

    Problem 1.

          CString str = bstrHint;
    

    Fehhler:
    error C2440: "Initialisierung": "BSTR" kann nicht in "ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<_CharType>>>" konvertiert werden
    with
    [
    _CharType=char
    ]
    Konstruktor für class "ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<_CharType>>>" ist als "explicit" deklariert
    with
    [
    _CharType=char
    ]

    Fehler (aktiv) E0415 Für eine Konvertierung von ""BSTR"" in""ATL::CStringT<char, StrTraitMFC_DLL<char, ATL::ChTraitsCRT<char>>>"" ist kein passender Konstruktor vorhanden. CxPCDLib

    Fehler C2440 "Initialisierung": "BSTR" kann nicht in "ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<_CharType>>>" konvertiert werden

    Das war vorher kein Problem.

    Problem 2:
    afxv_w32.h

    // SDKDDKVer.h will set any of WINVER, NTDDI_VERSION and _WIN32_IE that are yet unset.
    #include <sdkddkver.h>
    
    #if (WINVER < 0x0501)
    #error MFC does not support WINVER less than 0x0501.  Please change the definition of WINVER in your project properties or precompiled header.
    #endif
    
    sdkdkver.h
    #ifndef WINVER
    #ifdef _WIN32_WINNT
    // set WINVER based on _WIN32_WINNT
    #define WINVER          _WIN32_WINNT
    #else
    #define WINVER          0x0A00
    #endif
    #endif
    
    
    

    Fehler
    Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
    Fehler C1189 #error: MFC does not support WINVER less than 0x0501. Please change the definition of WINVER in your project properties or precompiled header.

    Das sind beides Systemheader.
    Wo muss ich was einstellen????

    Danke Torsten



  • Zu 1:

    CString str(bstrHint); // Aufruf des expliziten Konstruktors, anstatt des impliziten CString str = CString(bstrHint)
    

    Zu 2:
    Anscheinend ist das Makro WINVER nicht gesetzt.
    Daher, entsprechend der Fehlermeldung, entweder in den Projekteigenschaften das Makro definieren (-DWINVER=0x501) oder aber in einem globalen Header (z.B. "stdafx.h"):

    #define WINVER 0x501 // entspricht WIN32_WINNT_WINXP
    

    Dies ist die mindest zu unterstützende Windows-Version, s.a. Aktualisieren von WINVER und _WIN32_WINNT ("_WIN32_WINNT version constants").
    So wie dort beschrieben, am besten auch gleichzeitig _WIN32_WINNT setzen.



  • Hallo Th69,
    du hast mir sehr geholfen. Vielen Dank.

    Es geht weiter. Aber jetzt meckert er folgendes an:

    		Log_Debug("CCxRegistry::GetValue write DefaultValue for '%X\\%s\\%s'", hDefaultKey, strKeyName, strValueName);
    

    Fehler:
    Fehler C2039 "AfxCtxMessageBox" ist kein Member von "`global namespace'".
    Fehler C3861 "AfxCtxMessageBox": Bezeichner wurde nicht gefunden.

    und ich bekomme Warnungen bei:

    	m_strInfo.Format(IDS_PROGRESS_INFO_GET, strName, _T("FTP"));
    

    Hinweis:
    Der Konstruktor und der Destruktor werden nicht aufgerufen. Eine bitweise Kopie der Klasse wird als Argument übergeben.
    :\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\atlmfc\include\afxstr.h(87,43): message : Siehe Deklaration von "ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<_CharType>>>"
    with
    1> [
    1> _CharType=char
    1> ]
    1>warning C4840: Nicht portierbare Verwendung der Klasse "ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<_CharType>>>" als Argument für eine variadic-Funktion.
    1> with
    1> [
    1> _CharType=char
    1> ]
    1>: message : "ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<_CharType>>>::CStringT" ist nicht trivial.
    1> with
    1> [
    1> _CharType=char
    1> ]
    1>p:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Tools\MSVC\14.29.30133\atlmfc\include\cstringt.h(1030,2): message : Siehe Deklaration von "ATL::CStringT<char,StrTraitMFC_DLL<char,ATL::ChTraitsCRT<_CharType>>>::CStringT"
    1> with
    1> [
    1> _CharType=char
    1> ]
    1>

    Ich breche das bald ab wenn das so weiter geht. Warum muss das immer ausarten?

    Gruß Torsten



  • Die früheren MFC-Versionen waren designtechnisch nicht so gut konzipiert (und einiges ist es bis heute nicht 😢 ) und dann wurden eben programmtechnische Verbesserungen durchgeführt.

    Fehlerbehebung bzw. Verbesserungen bei der Migration auf neuere Versionen durchzuführen, gehört aber zum Alltag eines Entwicklers (bzw. sollte gehören).

    Zu den Fehlern:
    Log_Debug ist wohl ein Makro von AfxCtxMessageBox (bzw. verwendet es). Schau mal in den Source davon (ich finde leider online keine Referenz, wo diese Funktion definiert ist - müßte aber in <afxwin.h> sein).

    Und die CStringT::Format-Warnung ist doch eindeutig. Im Code wird ein CStringT-Objekt übergeben (und wegen der bitweisen Kopie der Argumente werden weder dessen (Kopier-)Konstruktor noch Destruktor aufgerufen). Verwende dort für jeden CStringT-Parameter den expliziten Cast: (LPCTSTR)str
    Oder ignoriere diese Warnung C4840 in den Projekteinstellungen (wenn es bei dir läuft).


  • Mod

    @Tossi65 sagte in Mfc Projekt nach VS 2019 portieren:

    m_strInfo.Format(IDS_PROGRESS_INFO_GET, strName, _T("FTP"))

    Stat dem cast besser GetString nutzen.

    m_strInfo.Format(IDS_PROGRESS_INFO_GET, strName.GetString(), _T("FTP"))
    

Anmelden zum Antworten