Winapi.Mtx.SafeRef

De RAD Studio API Documentation
Aller à : navigation, rechercher

Delphi

function SafeRef(const rid: TGUID; Unk: IUnknown): Pointer;

Propriétés

Type Visibilité  Source Unité  Parent
function public Winapi.Mtx.pas Winapi.Mtx Winapi.Mtx

Description

Renvoie une référence à un objet transactionnel pour la transmettre hors de son contexte en toute sécurité.

La fonction SafeRef encapsule la fonction MTS SafeRef qui transmet une référence vers l'ID de l'interface (rid) que l'objet actuel veut transmettre à un autre objet ou client et une référence vers une interface de l'objet actuel (pUnk).

SafeRef renvoie un pointeur vers l'interface précisée dans le paramètre Riid, qui peut être transmis en toute sécurité hors du contexte de l'objet actuel.

Avec COM+, il est toujours plus prudent de transmettre une auto-référence à un client ou à un autre objet. Donc, si vous appelez SafeRef dans une application exécutée sur une version de Windows qui implémente COM+, SafeRef renvoie simplement le pointeur transmis dans pUnk. Il n'est donc pas nécessaire d'appeler SafeRef pour les applications COM+. Néanmoins, cela n'aura aucune incidence dans une application utilisée à la fois sous MTS et COM+.

Sous MTS, appelez toujours SafeRef avant de transmettre une auto-référence à un client ou à un autre objet, puis transmettez la référence renvoyée par cet appel. Sous MTS, il n'est pas prudent pour un objet de transmette un pointeur self (Delphi) ou this (C++) à un client ou à un autre objet, ni une auto-référence obtenue par un appel interne à QueryInterface. Une fois une telle référence transmise hors du contexte de l'objet, la référence n'est plus valide.

Appeler SafeRef sur une référence déjà sécurisée renvoie la même référence sans modification, si ce n'est que le décompte des références de l'interface est incrémenté.

Quand un client appelle QueryInterface sur une référence sécurisée, MTS vérifie automatiquement que la référence renvoyée au client est également une référence sécurisée.

Un objet qui obtient une référence sécurisée doit la libérer quand il n'en a plus besoin.

Sous MTS, les références sécurisées ont des valeurs de pointeurs différentes de leurs contreparties non sécurisées. Par exemple, self ou this et la version sécurisée de self ou this n'ont pas la même valeur. Il est important d'en être averti, lorsque vous testez si deux pointeurs font référence au même objet. Appeler QueryInterface pour IID_IUnknown sur chaque pointeur et comparer la valeur des pointeurs renvoyés peut donner une conclusion erronée. Il se peut que les deux pointeurs fassent référence au même objet, mais qu'un seul corresponde à une référence sécurisée. Si les deux références sont sécurisées, elles peuvent être comparées normalement. Ceci ne concerne que les objets MTS, puisque les clients ne doivent jamais avoir accès à des références non sécurisées.

Remarque :  Lorsque vous écrivez un objet transactionnel pouvant être installé sous MTS ou COM+, utilisez plutôt la méthode SafeRef de TMtsDll. TMtsDll contrôle automatiquement l'environnement courant et renvoie la référence appropriée.

Voir aussi