Warnung C4996: 'GetVersionExW': wurde als veraltet deklariert
Arbeite ich auf VS 2013 unter Win 8.1.
Wie lösen Sie diese Warnung?
InformationsquelleAutor der Frage yemans | 2014-03-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Arbeite ich auf VS 2013 unter Win 8.1.
Wie lösen Sie diese Warnung?
InformationsquelleAutor der Frage yemans | 2014-03-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die grundlegende Frage ist "warum rufst du
GetVersionExW
in den ersten Platz?" Die Antwort auf diese Frage bestimmt, was Sie stattdessen tun sollte.Deprecation Warnung ist da, um Entwickler geben ein heads-up über die appcompat Verhalten zu ändern, die Schritte in Windows 8.1. Sehen Windows und Windows Server compatibility cookbook: Windows 8, Windows 8.1 und Windows Server 2012. Kurz gesagt, dass die Funktion nicht zurück, was Sie denken, es gibt standardmäßig.
Historisch, schlecht geschrieben, OS-version überprüft sind die primäre Quelle appcompat Fehler für Windows-Betriebssystem-upgrades. Es habe eine Reihe von unterschiedlichen Ansätzen versucht, diese zu mildern problem (AppVerifier-version liegen, die
VerifyVersionInfo
API, etc.), und dies ist die höchste bisher.Den
VersionHelpers.h
erwähnt, sind die Kommentare in der Windows-8.1-SDK, die mit Visual Studio 2013. Sie sind nicht eine neue API; Sie sind nur ein Dienstprogramm-code, macht Gebrauch von derVerifyVersionInfo
API in Windows 2000 eingeführten. Diese Funktionen sind für tun, "müssen Sie diese hoch zu fahren, diese Fahrt" Stil-Prüfungen, die die Klasse der version überprüft, die sind meistens schlecht geschrieben. Der code ist ziemlich einfach. Zum Beispiel, dieIsWindowsVistaSP2OrGreater
test:Brauchen Sie nicht zu verwenden
VersionHelpers.h
wie konnten Sie nur tun, diese Art von code sich selbst, aber Sie sind bequem, wenn Sie schon mit der VS 2013 compiler. Für Spiele habe ich einen Artikel Was ist in einer version-Nummer?die verwendetVerifyVersionInfo
zu tun, die Art von vernünftigen Kontrollen sollte man für das Spiel deployment.Den anderen großen Einsatz der
GetVersionExW
ist eine Diagnose-und Telemetrie-Protokolle. In diesem Fall ist eine option, um weiterhin verwenden, die API und stellen Sie sicher, dass Sie das Recht haben, die manifest-Einträge in Ihrer Anwendung auf hinreichend genaue Ergebnisse. Sehen MANIFESTEN Wahnsinn für details auf das, was Sie hier tun, dies zu erreichen. Die wichtigste Sache im Auge zu behalten ist, dass, es sei denn, Sie routinemäßig aktualisieren Sie den code, werden Sie schließlich stoppen immer vollständig korrekte Informationen in einer zukünftigen version des OS.Für Diagnose-Protokolle, ein anderer Ansatz, der vielleicht ein bisschen robuster ist, greifen die Versionsnummer aus einer system-DLL wie
kernel32.dll
mitGetFileVersionInfoW
. Dieser Ansatz hat einen großen caveet: versuchen Sie nicht analysieren, das tun Vergleiche, oder machen Sie code sich die Annahmen auf die version der Datei erhalten Sie auf diese Weise, nur schreiben Sie es auf irgendwo. Sonst riskieren Sie, Neuerstellung der gleichen schlechten OS-version überprüfen problem, das besser gelöst mitVerifyVersionInfo
. Diese option ist nicht verfügbar für Windows-Store-apps, Windows phone apps, etc. aber sollten für die Win32-desktop-apps.Wenn es irgendeinen anderen Grund, den Sie anrufen
GetVersionExW
Sie wahrscheinlich sollte nicht aufgerufen werden. Die Suche nach einer Komponente, die fehlt, sollte nicht gebunden werden, um eine version zu überprüfen. Zum Beispiel, wenn Ihre Anwendung erfordert, dass Media Foundation ist, sollte man mit "Sie müssen diese hoch zu fahren, diese Fahrt prüfen," wie die VersionHelpers.hIsWindowsVistaOrGreater
für die Bereitstellung, aber bei der Laufzeit, die Sie verwenden sollten, die explizite Verknüpfung überLoadLibrary
oderLoadLibaryEx
eine Störung zu melden oder einen fallback, wennMFPLAT.DLL
nicht gefunden.Anderes Beispiel: wenn Sie Ihre Anwendung verwenden will, Direct3D 11.2, wenn es verfügbar ist und anderweitig verwendet DirectX 11.0, die Sie verwenden würden, setzen eine
IsWindowsVistaSP2OrGreater
minimale bar für die Bereitstellung vielleicht mit der D3D11InstallHelper. Dann, zur Laufzeit, Sie würde die DirectX 11.0 Gerät und wenn es scheitert, Sie würde einen Fehler melden. Wenn Sie erhalten einenID3D11Device
dann würden SieQueryInterface
für eineID3D11Device2
die, wenn es Ihr gelingt, bedeutet, dass Sie verwenden ein Betriebssystem mit Unterstützung für DirectX 11.2. Sehen Anatomie von Direct3D 11 Erstellen Gerät.Wenn diese hypothetische Direct3D-Anwendung unterstützt Windows XP, die Sie verwenden würden, ein Bereitstellung-bar von
IsWindowsXPSP2OrGreater
oderIsWindowsXPSP3OrGreater
und dann zur Laufzeit verwenden Sie die explizite Verknüpfung, um zu versuchen zu finden, dieD3D11.DLL
. Wenn es nicht anwesend war, würden Sie wieder zurückgehen, um mit Direct3D-9-da wir die Mindest-bar, wir wissen, dass DirectX 9.0 c oder höher ist immer vorhanden.Sie entscheidende Punkt hier ist, dass in den meisten Fällen, sollten Sie nicht verwenden
GetVersionEx
.InformationsquelleAutor der Antwort Chuck Walbourn
können Sie diese Warnung deaktivieren, und verwenden Sie GetVersionEx sowieso durch hinzufügen:
InformationsquelleAutor der Antwort user1438233
Während GetVersionEx wurde als veraltet deklariert, wenn Sie werfen in eine ordnungsgemäße Kompatibilität-manifest deklarieren, auf die Kompatibilität mit Windows 8.1 und Windows 10, GetVersionEx wird wieder die richtige Versionsnummer. Ich benutze GetVersionEx zu erkennen, Windows 8 oder höher, und Windows 8 ist die Letzte version von Windows, die nicht verlangen, ein manifest zur Rückgabe der entsprechenden Windows-version, mein code funktioniert unabhängig davon, ob die Windows-API zurück 6.2, 6.3, 6.4 (für die frühen Windows-10-Vorschau), oder 10.0.
Mit alles, was gesagt, veraltet Microsoft diese API im Teil wegen der schlechten Nutzung von it. Nehmen Sie zum Beispiel diese versucht zu erkennen, Windows XP oder höher:
Diesem Beispiel würde TRUE zurückgeben, auf Windows XP, Server 2003, 7, 8 und 8.1, würde aber FALSE zurück auf Windows Vista oder 10. Hinzufügen einer Zeile würde dieses Problem beheben:
Diesem Beispiel würde korrekt funktionieren, weil es weiß, dass, wenn die major-version 6 oder größer es ist größer als XP.
InformationsquelleAutor der Antwort William