Éviter le polymorphisme
Les nouveaux types de données incluent deux types polymorphes, INT_PTR et LONG_PTR. Sur Windows 32 bits, le INT_PTR correspond à int et le LONG_PTR correspond à long. Sur Windows 64 bits, les deux types sont mappés au type intrinsèque __int64 . Le compilateur MIDL prend en charge ces types pour les appels de procédure distante, mais il existe une limitation inhérente que vous devez garder à l’esprit lorsque vous les utilisez dans un environnement distribué. Veillez à commenter votre code en conséquence.
Quelle que soit la taille de la plateforme, la taille du fil de ces types polymorphes est toujours de 32 bits. Lors d’un démarchant sur Windows 64 bits, le signe de bibliothèque au moment de l’exécution étend les valeurs signées et affecte zéro aux octets d’ordre élevé pour une valeur non signée. Lorsque vous placez une valeur 64 bits sur le réseau, le temps d’exécution tronque les octets d’ordre élevé. Ainsi, seules les valeurs 32 bits d’ordre inférieur sont utilisables.
Utilisez les types polymorphes uniquement lorsque cela est nécessaire pour le portage. Pour les nouvelles interfaces, utilisez les types entiers intrinsèques MIDL __int32 et __int64, ou utilisez un type de pointeur ou un handle de contexte, selon la valeur la plus appropriée pour le type de données transférées.
Le compilateur 64 bits prend en charge une nouvelle __int3264 intrinsèque polymorphe. Là encore, ce type a été développé pour prendre en charge les efforts de portage, en l’occurrence pour prendre en charge les types UINT_PTR de manière transparente. (Une autre intrinsèque, __long3264, prend en charge le type ULONG_PTR .) N’utilisez pas __int3264 directement ; utilisez le type INT_PTR lorsque vous avez besoin d’un type polymorphe pour des raisons de portage.