Pourquoi MAKEINTRESOURCE () fonctionne-t-il?
La macro est définie comme:
#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i))))
#define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i))))
Comment cela peut être utilisé pour indiquer un ID de ressource (16 bits unsigned int) ou de son nom (un pointeur vers un tableau de char)?
N'est-ce pas effectivement de limiter l'espace d'adressage (sur un système 32 bits à 16 bits? Sinon, comment fait-on pour savoir si je suis en utilisant un ID ou un nom?
source d'informationauteur user418680
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne parce que Windows ne permet pas de cartographie des pages pour les 64 premiers KO de l'espace d'adressage. Pour attraper les références de pointeur null. Mais je pense aussi à attraper pointeur de bugs dans les programmes qui ont été converties à partir de la version 16 bits de Windows.
Un effet secondaire est que cela permet de distinguer de manière fiable les Id de ressource emballé dans une valeur de type pointeur, car ils vous toujours le point de non cartographiables mémoire.
MAKEINTRESOURCE macro tout à fait la conversion entre les paramètre numérique et le pointeur de la chaîne. La chaîne résultante pointeur est invalide et ne peut être déréférencé comme le nom de la ressource. Cependant, les ressources de manipulation de l'API de détecter de tels pointeurs par leur valeur absolue et de les traiter comme ID de ressource et pas le nom de la ressource. Depuis de style C de l'API ne les supporte pas la surcharge, elles ne peuvent pas définir deux fonctions telles que:
Donc, l'API développeurs ont décidé d'utiliser la même fonction pour les deux cas, fournir MAKEINTRESOURCE macro pour les utilisateurs de l'API. Je crois que les deux fonctions différentes pourrait regarder mieux:
Mais ce n'est pas la voie de l'API Windows est mis en œuvre. Valide ID de ressource est toujours moins que le minimum possible la valeur du pointeur. Ressource de nom de paramètre est transmis à l'API sans cette macro, et sa valeur n'est pas limité.
Oui, il ne limite pas l'adresse de l'espace, mais pas autant que vous le pensez. Ils ont effectivement taillé 64 ko de votre 4 GO d'espace d'adresse. La plupart, si pas tous, de que 64 KO est déjà réservée pour d'autres choses sur Windows, de sorte que la perte effective n'est rien.
Dans l'ensemble, c'est un gain de place, car ils n'ont pas besoin d'un supplément d'information afin de faire la distinction entre un pointeur et un entier d'identification. Cela a été inventé en arrière dans les mauvais jours, quand l'espace est à une prime.