lang HWND (VS8 C ++)
-
01-07-2019 - |
Frage
Wie kann ich werfen lange HWND (C ++ Visual Studio 8)?
Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;
Aber ich habe die folgende Warnung:
Warnung C4312: 'type cast': Konvertierung von 'LONG' auf 'HWND' größere Größe
Danke.
Lösung 2
HWND ist ein Handle zu einem Fenster. Dieser Typ wird in windef.h erklärt wie folgt:
typedef GRIFF HWND;
GRIFF ist auf ein Objekt behandeln. Dieser Typ wird in WinNT.h erklärt wie folgt:
typedef PVOID Griff;
Schließlich ist PVOID ein Zeiger auf jede Art. Dieser Typ wird in WinNT.h erklärt wie folgt:
typedef void * PVOID;
Also, HWND ist eigentlich ein Zeiger auf void. Sie können eine lange auf einen HWND wie diese Stimmen:
HWND h = (HWND) my_long_var;
aber sehr vorsichtig, welche Informationen in my_long_var gespeichert. Sie müssen sicherstellen, dass Sie einen Zeiger in dort haben.
Später bearbeiten: Die Warnung vor, dass Sie 64-Bit-Portabilität Kontrollen eingeschaltet haben. Wenn Sie eine 32-Bit-Anwendung Gebäude sind können Sie sie ignorieren.
Andere Tipps
Solange Sie sicher sind, dass die lange Sie haben, ist wirklich ein HWND, dann ist es so einfach wie:
HWND hWnd = (HWND)(LONG_PTR)lParam;
Dadurch, dass nur sicher ist, wenn Sie nicht auf einer 64-Bit-Version von Windows ausgeführt werden. Der LONG-Typ ist 32 Bit, aber der Griff-Typ ist wahrscheinlich 64 Bit. Sie werden Ihren Code 64 Bit sauber machen müssen. Kurz gesagt, werden Sie die LONG zu einer LONG_PTR ändern.
Regeln für Zeigertypen verwenden :
Sie keine Zeiger zu gieße int, lang, ULONG oder DWORD. Wenn Sie muss ein Guss Zeiger einige Bits zu testen, eingestellt oder klar Bits oder anderweitig manipulieren sein Inhalt, verwenden Sie die UINT_PTR oder INT_PTR Typ. Diese Typen sind integral Typen, die auf die Größe einer Skala Zeiger sowohl für 32-Bit- und 64-Bit- Fenster (zum Beispiel ULONG für 32-Bit Fenster und _int64 für 64-Bit Windows). Zum Beispiel nehme an, Sie sind Portierung von dem folgenden Code:
= Imagebase (PVOID) ((ULONG) Imagebase | 1);
Als Teil des Portierungsprozesses, Sie würden Sie den Code wie folgt ändern:
= Imagebase (PVOID) ((ULONG_PTR) Imagebase | 1);
Verwenden UINT_PTR und INT_PTR wo falls (und wenn Sie unsicher sind, ob sie erforderlich sind, gibt es keine Schaden in sie nur für den Fall verwendet wird). Machen werfen die Zeiger nicht auf die Typen ULONG, LONG, INT, UINT oder DWORD.
Beachten Sie, dass GRIFF als definiert void *, so einen Griff Wert typecasting um einen ULONG Wert zu testen, Satz, oder die niederwertigen 2 Bits klar ist, ist ein Fehler auf 64-Bit-Windows.