TN003 : Cartographie de Windows gère les objets

Cette note décrit le MFC routines qui prennent en charge Windows de mappage objet poignées d'objets C++.

Le problème

Objets Windows sont normalement représentés par gérers. Les classes MFC enveloppez les poignées avec les objets C++ Windows. Les fonctions d'emballage de handle de la bibliothèque de classes MFC fournissent un moyen pour trouver l'objet C++ qui est envelopper l'objet Windows avec une poignée en particulier. Il arrive parfois lorsqu'un objet Windows n'a pas un objet de wrapper C++, cependant et à ces moments qu'un objet temporaire est créé pour agir en tant que wrapper C++.

Les objets de Windows qui utilisent des cartes de la Manche:

Étant donné un handle à un de ces objets, vous pouvez trouver l'objet MFC qui encapsule le handle en appelant la fonction membre statique FromHandle. Par exemple, donné un HWND hWnd d'appelé:

CWnd::FromHandle(hWnd)

va renvoyer un pointeur vers le CWnd qui encapsule le hWnd. Si ce hWnd n'a pas un objet wrapper spécifique, un temporaire CWnd est ensuite créé pour encapsuler les hWnd. Cela permet d'obtenir un objet C++ valide d'une poignée.

Une fois que vous avez un objet wrapper, vous pouvez obtenir son manche grâce à une variable de membre public. Dans le cas d'une CWnd, m_hWnd contient le HWND pour cet objet.

Fixation des poignées aux objets MFC

Étant donné un objet wrapper-poignée nouvellement créé et un handle à un objet Windows, vous pouvez associer les deux en appelant Attach. Par exemple:

CWnd myWnd ;
myWnd.Attach(hWnd)

Ce qui fait une entrée de la carte permanente associant myWnd et hWnd. Appeler CWnd::FromHandle(hWnd) va maintenant retourner un pointeur vers myWnd. Lorsque myWnd est supprimé, le destructeur vont détruire automatiquement le hWnd en appelant la fonction Windows DestroyWindow . Si ce n'est pas souhaité, le hWnd doit être détaché de myWnd avant que l'objet myWnd est détruit (normalement quand quittant la portée à laquelle myWnd a été définie). La fonction de membre de détacher le fait.

myWnd.Detach()

Pour en savoir plus sur les objets temporaires

Objets temporaires sont créés chaque fois que FromHandle reçoit un handle qui n'a pas déjà un objet wrapper. Ces objets temporaires sont détachés de leur poignée et supprimés par les fonctions DeleteTempMap . Le traitement par défaut OnIdle CWinThread appelle automatiquement DeleteTempMap pour chaque classe qui prend en charge les cartes poignée temporaire. Cela signifie que vous ne peut pas supposer qu'un pointeur vers un objet temporaire sera valable au-delà du point de sortie de la fonction où le pointeur a été obtenu, comme l'objet temporaire est supprimé au cours de la durée d'inactivité boucle de message Windows.

Objets wrapper et plusieurs Threads

Les objets temporaires et permanents sont conservés sur une base par thread. C'est un thread ne peut pas accéder un autre fils objets wrapper C++, indépendamment de la question de savoir si c'est temporaire ou permanente. Comme indiqué plus haut, les objets temporaires sont supprimés lorsque le thread qui appartient cet objet temporaire entre OnIdle.

Pour passer ces objets d'un thread à un autre, toujours envoyer en tant que leur native gérer type. Passer un objet de wrapper C++ d'un thread à un autre entraîne souvent des résultats inattendus.

&Notes techniques par le numéro |nbsp ; Notes techniques par catégorie

Index