long à HWND (VS8 C ++)
-
01-07-2019 - |
Question
Comment puis-je lancer un long métrage sur HWND (C ++ Visual Studio 8)?
Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;
Mais j'ai eu l'avertissement suivant:
avertissement C4312: 'type cast': conversion de 'LONG' en 'HWND' de taille supérieure
Merci.
La solution 2
HWND est un descripteur de fenêtre. Ce type est déclaré dans WinDef.h comme suit:
typedef HANDLE HWND;
HANDLE est le traitement d'un objet. Ce type est déclaré dans WinNT.h comme suit:
typedef PVOID HANDLE;
Enfin, PVOID est un pointeur sur n’importe quel type. Ce type est déclaré dans WinNT.h comme suit:
typedef void * PVOID;
Donc, HWND est en fait un pointeur à annuler. Vous pouvez lancer un long vers un HWND comme ceci:
HWND h = (HWND) my_long_var;
mais très attentif aux informations stockées dans my_long_var. Vous devez vous assurer que vous avez un pointeur à l'intérieur.
Éditer plus tard: L'avertissement suggère que les contrôles de portabilité 64 bits sont activés. Si vous construisez une application 32 bits, vous pouvez les ignorer.
Autres conseils
Tant que vous êtes sûr que votre LONG est vraiment un HWND, c’est aussi simple que:
HWND hWnd = (HWND)(LONG_PTR)lParam;
Cela n’est sûr que si vous n’exécutez pas une version 64 bits de Windows. Le type LONG est de 32 bits, mais le type HANDLE est probablement de 64 bits. Vous devrez rendre votre code propre 64 bits. En bref, vous voudrez changer le LONG en LONG_PTR.
Règles d'utilisation des types de pointeur :
Ne jetez pas de pointeur sur int, long, ULONG ou DWORD. Si vous devez lancer un pointeur pour tester des bits, définir ou effacer les bits, ou autrement manipuler son contenu, utilisez le UINT_PTR ou Type INT_PTR. Ces types font partie intégrante types qui mesurent à la taille d'un pointeur pour 32 et 64 bits Windows (par exemple, ULONG pour 32 bits Windows et _int64 pour 64 bits Les fenêtres). Par exemple, supposons que vous êtes porter le code suivant:
ImageBase = (PVOID) ((ULONG) ImageBase | 1);
Dans le cadre du processus de portage, vous changerait le code comme suit:
ImageBase = (PVOID) ((ULONG_PTR) ImageBase | 1);
Utilisez UINT_PTR et INT_PTR où approprié (et si vous êtes incertain si elles sont nécessaires, il n'y a pas mal à les utiliser au cas où). Faire ne jetez pas vos pointeurs sur les types ULONG, LONG, INT, UINT ou DWORD.
Notez que HANDLE est défini comme un void *, donc en convertissant une valeur HANDLE à une valeur ULONG pour tester, définir ou effacer les 2 bits de poids faible est une erreur sous Windows 64 bits.