2008-09-18 12 views
7

Comment puis-je lancer longtemps à HWND (C++ Visual Studio 8)?long à HWND (VS8 C++)

Long lWindowHandler; 
HWND oHwnd = (HWND)lWindowHandler; 

Mais j'ai l'avertissement suivant:

avertissement C4312: 'type cast': la conversion de 'LONG' à 'HWND' de plus grande taille

Merci.

Répondre

8

HWND est une poignée à une fenêtre. Ce type est déclaré dans WinDef.h comme suit:

type HANDLE HWND;

HANDLE est la poignée d'un objet. Ce type est déclaré dans WinNT.h comme suit:

typedef PVOID HANDLE;

Enfin, PVOID est un pointeur vers n'importe quel type. Ce type est déclaré dans WinNT.h comme suit:

typedef void * PVOID;

Donc, HWND est en fait un pointeur sur void. Vous pouvez lancer un long à un HWND comme ceci:

HWND h = (HWND) my_long_var;

mais très prudent de quelles informations sont stockées dans my_long_var. Vous devez vous assurer que vous avez un pointeur là-dedans.

Édition ultérieure: L'avertissement suggère que vous avez activé les vérifications de portabilité 64 bits. Si vous créez une application 32 bits, vous pouvez les ignorer.

9

Tant que vous êtes sûr que le temps vous avez est vraiment un HWND, il est aussi simple que:

HWND hWnd = (HWND)(LONG_PTR)lParam; 
+0

Merci pour votre réponse. J'ai essayé et j'ai reçu un avertissement: avertissement C4312: 'type cast': conversion de 'LONG' à 'HWND' de plus grande taille des suggestions? Merci. –

+1

Je pense que c'est la meilleure réponse, '(HWND) long_ver' ne fonctionne pas pour moi! – ehsun7b

5

Cela n'est sûr que si vous n'utilisez 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 nettoyer votre code 64 bits. En bref, vous voudrez changer le LONG à un LONG_PTR.

:

Ne pas jeter des pointeurs sur int, long, ULONG ou DWORD. Si vous devez émettre un pointeur pour tester certains bits, définir ou effacer des bits, ou manipuler autrement son contenu, utilisez le type UINT_PTR ou INT_PTR.Ces types sont des types qui s'échelonnent à la taille d'un pointeur pour Windows 32 bits et 64 bits Windows (par exemple, ULONG pour Windows 32 bits Windows et _int64 pour Windows 64 bits ). Par exemple, supposons que vous êtes en indiquant le code suivant:

ImageBase = (PVOID) ((ULONG) ImageBase | 1);

En tant que partie du processus de transfert, vous changerait le code comme suit:

ImageBase = (PVOID) ((ULONG_PTR) ImageBase | 1);

Utilisez UINT_PTR et INT_PTR où approprié (et si vous n'êtes pas certain si elles sont nécessaires, il n'y a pas de mal à les utiliser au cas où). Ne ne pas diffuser vos pointeurs vers les types ULONG, LONG, INT, UINT ou DWORD.

Notez que la poignée est définie comme une * de vide, typecasting si une valeur de descripteur à une valeur ULONG à tester, régler ou claires le bas d'ordre 2 bits est une erreur sur Windows 64 bits.

+1

Alors que votre conseil est correct pour les pointeurs, voir [cette réponse sur les longueurs de poignée] (http://stackoverflow.com/a/29526711/2636001) (ou [l'article MSDN correspondant] (https://msdn.microsoft.com /en-us/library/windows/desktop/aa384203%28v=vs.85%29.aspx))- 'HWND' utilise seulement les 32 bits les plus bas et est donc sûr à travers les limites de processus. – dst