STRICT Compliance
Einige Quellcode, der erfolgreich kompiliert wird, erzeugt möglicherweise Fehlermeldungen, wenn Sie STRICT Typüberprüfung aktivieren. In den folgenden Abschnitten werden die minimalen Anforderungen für die Kompilierung des Codes beschrieben, wenn STRICT- aktiviert ist. Zusätzliche Schritte werden empfohlen, insbesondere zum Erstellen von tragbarem 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 keinen Handletyp verwenden, bei dem eine andere erwartet wird. Dies bedeutet auch, dass Sie möglicherweise Funktionsdeklarationen ändern und mehr Typ casts 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 einfach überprüfen und nach Parameter- und Rückgabetypen suchen können, die geändert werden sollen.
Wenn Sie die Option /Zg Compiler verwenden, um Headerdateien für Ihre Funktionen zu erstellen, denken Sie daran, dass Sie unterschiedliche Ergebnisse erhalten, je nachdem, ob Sie STRICT Typüberprüfung aktiviert haben. Wenn STRICT deaktiviert ist, generieren alle Handletypen denselben Basistyp. Wenn STRICT aktiviert ist, generieren sie unterschiedliche Basistypen. Um Konflikte zu vermeiden, müssen Sie die Headerdatei jedes Mal erneut erstellen, wenn Sie STRICT-aktivieren oder deaktivieren oder die Headerdatei bearbeiten, um die Typen HWND-, HDC-, HANDLEusw. anstelle der Basistypen zu verwenden.
Alle Funktionsdeklarationen, die Sie aus Windows.h in Den Quellcode kopiert haben, wurden möglicherweise geändert, und Ihre lokale Deklaration ist möglicherweise veraltet. Entfernen Sie Die lokale Deklaration.
Typen, für die Umwandlungen erforderlich sind
Einige Funktionen verfügen über generische Rückgabetypen oder Parameter. Beispielsweise gibt die SendMessage--Funktion Daten zurück, die je nach Kontext eine beliebige Anzahl von Typen sein können. Wenn eine dieser Funktionen im Quellcode angezeigt wird, stellen Sie sicher, dass Sie den richtigen Typ cast verwenden und so spezifisch wie möglich sind. Die folgende Liste ist ein Beispiel für diese Funktionen.
- LocalLock-
- GlobalLock-
- GetWindowLong-
- SetWindowLong-
- SendMessage-
- DefWindowProc-
- SendDlgItemMessage-
Wenn Sie SendMessage-, DefWindowProc-oder SendDlgItemMessage-aufrufen, sollten Sie das Ergebnis zuerst in UINT_PTRumwandeln. Sie müssen ähnliche Schritte für jede Funktion ausführen, die einen 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 je nach Windows-Version variiert. Die Umwandlung (UINT_PTR) 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 Parameter hmenu 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ößten Nutzen von STRICT Typüberprüfung zu erzielen, gibt es zusätzliche Richtlinien, die Sie befolgen sollten. Ihr Code ist in zukünftigen Versionen von Windows portierbarer, wenn Sie die folgenden Änderungen vornehmen.
Die Typen WPARAM, LPARAM, LRESULTund LPVOID sind polymorphen Datentypen. Sie enthalten unterschiedliche Arten von Daten zu unterschiedlichen Zeiten, auch wenn 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 Nachrichten-Cracker automatisch wParam- und lParam- für Sie portierbar neu senden.)
Achten Sie darauf, HMODULE- und HINSTANCE- Typen zu unterscheiden. Auch 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.
Verwandte Themen