Question

Quelle est la bonne manière de convertir un objet "OLE_HANDLE" en "HICON" pour une génération de cible x64?

En particulier avec une distribution normale de style C, je reçois cet avertissement lors de la compilation avec une configuration x64:

avertissement C4312: 'type cast': conversion de 'OLE_HANDLE' en 'HICON' de taille supérieure

Voici le code incriminé:

imgList.Add((HICON)ohIcon);

Le code ci-dessus fonctionne bien pour moi, mais je souhaite me débarrasser de l'avertissement lors de la construction pour x64.

Était-ce utile?

La solution

Le H le donne, dans ce cas, le code de la bibliothèque a créé un type distinct pour vous donner un peu plus de sécurité de type (du temps des anciennes API C).

Ce sont en fait les deux HANDLE, un objet du noyau qui ne s’intéresse pas vraiment à la nature de la ressource, mais au fait que vous en avez une "poignée". N'oubliez pas que l'API est une version C, utilisez donc les conversions de style C et lorsque vous souhaitez la supprimer, utilisez DeleteObject ().

edit: 64 bits hein ... le problème vient du fait que MS a mis à jour les descripteurs en 64 bits, tout en laissant le contenu OLE seul. Heureusement, ils ont simplement ajouté des zéros aux éléments supplémentaires.

Essayez d’utiliser les routines de conversion LongToHandle . et consultez le Guide de portage MIDL - faites défiler à mi-chemin vers le " ; Les descripteurs USER et GDI sont des valeurs 32b de signature étendues " section.

Autres conseils

En supposant que vous utilisez Microsoft Visual Studio en fonction de la question ...

Si vous ne développez que des cibles 32 bits, vous pouvez choisir de le désactiver (ainsi que d'autres avertissements similaires) en désactivant l'option de projet " Détecter les problèmes de portabilité 64 bits " (Option du compilateur C ++ / Wp64).

Si vous développez également des cibles 64 bits, @Harper a probablement raison et vous aurez besoin de chercher plus avant pour trouver la bonne façon de gérer cela. Vous voudrez peut-être lire ce livre blanc comme point de départ; allez à la section sur les descripteurs USER et GDI.

J'ai creusé un peu - OLE_HANDLE semble être un long non signé, et HICON est un vide *. Dans Windows 32 bits, elles ont la même taille, mais dans Windows x64, le vide * est de 64 bits. Il n'y a pas de moyen sûr de faire ce casting - les 32 bits supplémentaires ne sont pas définis. Malheureusement, le seul conseil que j'ai pu comprendre concernant les ULONGs (les OLE_HANDLEs sont des bêtes encore plus rares) a simplement déclaré "ne jetez pas ceci à un pointeur".

Je soupçonne que le " correct " répondre pour le "bon" " La meilleure façon de jouer entre eux est "ne faites pas cela". Certes, ce n'est pas très utile ... D'où vient OLE_HANDLE? Il semble que vous deviez réécrire le code en utilisant OLE_HANDLE pour pouvoir utiliser HICON partout.

HICON hSomeIcon = (HICON) hSomeOLEHandle;

i.e. ils sont interchangeables.

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