Est-ce que l'appelant a besoin pour libérer le IShellBrowser * obtenu par le message WM_GETISHELLBROWSER sans papier (WM_USER + 7)?
-
19-09-2019 - |
Question
Plusieurs ont fait remarquer qu'il existe un message sans papier qui récupère le pointeur d'interface IShellBrowser de la HWND dialogue commune pour le fichier ouvert et enregistrer des boîtes de dialogue.
Mais il y a des informations contradictoires (ou pas d'informations) si ce pointeur est AddRef'd, ou si elle est juste l'adresse brute retournée, et pas de presse () doit être appelée à ce sujet?
La solution
Non. Vous trouverez peut-être le lien suivant utile: Les règles du Component Object Model .
Extrait:
Règles de comptage de référence
Règle 1: AddRef doit être appelé à chaque nouvelle copie d'une interface pointeur et Release appelé pour chaque destruction d'un pointeur d'interface, sauf si les règles suivantes explicitement permettre autrement.
Les règles suivantes appellent commun nonexceptions à la Règle 1.
- Règle 1a: In-out-paramètres aux fonctions. L'appelant doit Addref le paramètre réel, car il sera libéré par le callee lorsque le hors-valeur est stockée sur le dessus de celui-ci.
- Règle 1b: Récupérer une variable globale. La copie locale du pointeur d'interface extraite à partir d'une copie existante du pointeur dans une variable globale doit être indépendante de référence prise en compte, car les fonctions appelées pourraient détruire la copie dans l'économie mondiale alors que la copie locale est encore en vie.
- Règle 1c: pointeurs nouveaux synthétisés sur « l'air. » Une fonction qui synthétise un pointeur d'interface à l'aide des connaissances internes spéciales, plutôt que de l'obtenir d'une autre source, doit faire une AddRef initiale sur le pointeur nouvellement synthétisé. Des exemples importants de ces routines comprennent exemple des routines de création, les implémentations de IUnknown :: QueryInterface, et ainsi de suite.
- Règle 1d: Renvoi d'une copie d'un pointeur stocké en interne. Après le pointeur a été retourné, le callee n'a aucune idée de la façon dont sa durée de vie se rapporte à celle de la copie stockée en interne du pointeur. Ainsi, l'appel doit AddRef callee sur la copie du pointeur avant de le retourner.
Règle 2: Connaissances particulières de la part d'un élément de code de la relations des débuts et les terminaisons des durées de vie de deux ou plusieurs copies d'un pointeur d'interface peut permettre à des paires AddRef / Release pour être omis.
- Du point de vue du client COM, comptage de référence est toujours un concept par interface. Les clients ne doivent jamais supposer qu'un objet utilise le même nombre de référence pour toutes les interfaces.
- Les valeurs de retour de AddRef et Release ne doit pas être invoqué, et doit être utilisé uniquement à des fins de débogage.
- stabilité du pointeur; voir les détails dans le fichier d'aide OLE sous la rubrique « Règles de comptage de référence, » paragraphe « Stabiliser le pointeur this et de le garder valide ».
Voir l'excellent « Gestion de l'objet Lifetimes dans OLE » article technique par Douglas Hodges, et le chapitre 3 Inside OLE, 2ème édition, par Kraig Brockschmidt (MSDN Library, livres) pour plus d'informations sur de comptage de références.