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 MakroWINVER
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 vonAfxCtxMessageBox
(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 einCStringT
-Objekt übergeben (und wegen der bitweisen Kopie der Argumente werden weder dessen (Kopier-)Konstruktor noch Destruktor aufgerufen). Verwende dort für jedenCStringT
-Parameter den expliziten Cast:(LPCTSTR)str
Oder ignoriere diese Warnung C4840 in den Projekteinstellungen (wenn es bei dir läuft).
-
@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"))