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.

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top