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.

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top