Freigeben über


STRICT-Konformität

Einige Quellcodes, die erfolgreich kompiliert werden, können Fehlermeldungen erzeugen, wenn Sie die STRICT-Typüberprüfung aktivieren. In den folgenden Abschnitten werden die Minimalanforderungen für die Kompilierung Ihres Codes beschrieben, wenn STRICT aktiviert ist. Zusätzliche Schritte werden empfohlen, insbesondere zum Erstellen von portablem Code.

Allgemeine Anforderungen

Die Hauptanforderung besteht darin, dass Sie korrekte Handletypen und Funktionszeiger deklarieren müssen, anstatt sich auf allgemeinere Typen zu verlassen. Sie können nicht einen Handletyp verwenden, wenn ein anderer erwartet wird. Dies bedeutet auch, dass Sie möglicherweise Funktionsdeklarationen ändern und weitere Typumwandlungen verwenden müssen.

Um optimale Ergebnisse zu erzielen, sollte der generische HANDLE-Typ nur bei Bedarf verwendet werden.

Deklarieren von Funktionen in Ihrer Anwendung

Stellen Sie sicher, dass alle Anwendungsfunktionen deklariert sind. Das Platzieren aller Funktionsdeklarationen in einer Includedatei wird empfohlen, da Sie Ihre Deklarationen problemlos überprüfen und nach Parameter- und Rückgabetypen suchen können, die geändert werden sollen.

Wenn Sie die Compileroption /Zg verwenden, um Headerdateien für Ihre Funktionen zu erstellen, denken Sie daran, dass Sie unterschiedliche Ergebnisse erhalten, je nachdem, ob Sie die STRICT-Typüberprüfung aktiviert haben. Wenn STRICT deaktiviert ist, generieren alle Handletypen denselben Basistyp. Wenn STRICT aktiviert ist, generieren sie verschiedene Basistypen. Um Konflikte zu vermeiden, müssen Sie die Headerdatei jedes Mal neu erstellen, wenn Sie STRICT aktivieren oder deaktivieren, oder die Headerdatei bearbeiten, um die Typen HWND, HDC, HANDLE usw. anstelle der Basistypen zu verwenden.

Alle Funktionsdeklarationen, die Sie aus Windows.h in Ihren Quellcode kopiert haben, haben sich möglicherweise geändert, und Ihre lokale Deklaration ist möglicherweise veraltet. Entfernen Sie Ihre lokale Deklaration.

Typen, die Umwandlungen erfordern

Einige Funktionen verfügen über generische Rückgabetypen oder -parameter. Die SendMessage-Funktion gibt beispielsweise Daten zurück, die je nach Kontext eine beliebige Anzahl von Typen aufweisen können. Wenn eine dieser Funktionen im Quellcode angezeigt wird, stellen Sie sicher, dass Sie die richtige Typumwandlung verwenden und dass sie so spezifisch wie möglich ist. Die folgende Liste ist ein Beispiel für diese Funktionen.

Wenn Sie SendMessage, DefWindowProc oder SendDlgItemMessage aufrufen, sollten Sie zuerst das Ergebnis in die Eingabe UINT_PTR umwandeln. Sie müssen ähnliche Schritte für jede Funktion ausführen, die ein LRESULT- oder LONG_PTR-Wert zurückgibt, wobei das Ergebnis ein Handle enthält. Dies ist erforderlich, um portablen Code zu schreiben, da die Größe eines Handles abhängig von der Windows-Version variiert. Die (UINT_PTR) Umwandlung stellt eine ordnungsgemäße Konvertierung sicher. Der folgende Code zeigt ein Beispiel, in dem SendMessage ein Handle an einen Pinsel zurückgibt:

HBRUSH hbr;

hbr = (HBRUSH)(UINT_PTR)SendMessage(hwnd, WM_CTLCOLOR, ..., ...);

Der CreateWindow - und createWindowEx-Parameterhmenu wird manchmal verwendet, um einen ganzzahligen Steuerelementbezeichner (ID) zu übergeben. In diesem Fall müssen Sie die ID in einen HMENU-Typ umwandeln:

HWND hwnd;
int id;

hwnd = CreateWindow(
        TEXT("Button"), TEXT("OK"), BS_PUSHBUTTON,
        x, y, cx, cy, hwndParent,
        (HMENU)id,    // Cast required here
        hinst,
        NULL);

Weitere Überlegungen

Um den größtmöglichen Nutzen aus der STRICT-Typüberprüfung zu erzielen, gibt es zusätzliche Richtlinien, die Sie befolgen sollten. Ihr Code ist in zukünftigen Versionen von Windows portierbar, wenn Sie die folgenden Änderungen vornehmen.

Die Typen WPARAM, LPARAM, LRESULT und LPVOID sind polymorphe Datentypen. Sie enthalten verschiedene Arten von Daten zu unterschiedlichen Zeiten, auch wenn die STRICT-Typüberprüfung aktiviert ist. Um den Vorteil der Typüberprüfung zu erhalten, sollten Sie werte dieser Typen so schnell wie möglich umwandeln. (Beachten Sie, dass Nachrichtencracker wParam und lParam automatisch portierbar für Sie neu senden.)

Achten Sie besonders darauf, die Typen HMODULE und HINSTANCE zu unterscheiden. Selbst wenn STRICT aktiviert ist, werden sie als derselbe Basistyp definiert. Die meisten Kernelmodulverwaltungsfunktionen verwenden HINSTANCE-Typen , aber es gibt einige Funktionen, die nur HMODULE-Typen zurückgeben oder akzeptieren.

Deaktivieren von STRICT

Aktivieren von STRICT