Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Clase
Representa una referencia débil que solo puede usar Windows en tiempo de ejecución, no COM clásico. Una referencia débil representa un objeto que puede ser o no accesible.
Sintaxis
class WeakRef : public ComPtr<IWeakReference>;
Miembros
Constructores públicos
| Nombre | Descripción |
|---|---|
WeakRef::WeakRef constructor |
Inicializa una nueva instancia de la clase WeakRef. |
WeakRef::~WeakRef destructor |
Desinicializa la instancia actual de la clase WeakRef. |
Métodos públicos
| Nombre | Descripción |
|---|---|
WeakRef::As |
Establece el parámetro de puntero ComPtr especificado para representar la interfaz especificada. |
WeakRef::AsIID |
Establece el parámetro de puntero ComPtr especificado para representar el identificador de interfaz especificado. |
WeakRef::CopyTo |
Asigna un puntero a una interfaz, si está disponible, para la variable de puntero especificada. |
Operadores públicos
| Nombre | Descripción |
|---|---|
WeakRef::operator& |
Devuelve un objeto ComPtrRef que representa el objeto WeakRef actual. |
Comentarios
Un objeto WeakRef mantiene una referencia segura, asociada a un objeto, y puede ser o no válida. Llame al método As() o AsIID() para obtener una referencia segura. Cuando la referencia segura se válida, puede obtener acceso al objeto asociado. Cuando la referencia segura no es válida (nullptr), el objeto asociado es inaccesible.
Un objeto WeakRef se usa normalmente para representar un objeto cuya existencia se controla mediante una aplicación o un subproceso externo. Por ejemplo, construya un objeto WeakRef a partir de una referencia a un objeto de archivo. Mientras el archivo esté abierto, la referencia segura será válida. Sin embargo, si el archivo está abierto, la referencia segura no será válida.
Hay un cambio de comportamiento en los métodos As, AsIID y CopyTo en el Windows SDK. Anteriormente, después de llamar a cualquiera de estos métodos, podía comprobar WeakRef para nullptr para determinar si se obtuvo correctamente una referencia segura, como en el código siguiente:
WeakRef wr;
strongComptrRef.AsWeak(&wr);
// Now suppose that the object strongComPtrRef points to no longer exists
// and the following code tries to get a strong ref from the weak ref:
ComPtr<ISomeInterface> strongRef;
HRESULT hr = wr.As(&strongRef);
// This check won't work with the Windows 10 SDK version of the library.
// Check the input pointer instead.
if(wr == nullptr)
{
wprintf(L"Couldn't get strong ref!");
}
El código anterior no funciona al usar el SDK de Windows 10 (o posterior). En su lugar, compruebe el puntero que se pasó para nullptr.
if (strongRef == nullptr)
{
wprintf(L"Couldn't get strong ref!");
}
Jerarquía de herencia
Requisitos
Encabezado: client.h
Espacio de nombres: Microsoft::WRL
Constructor WeakRef::WeakRef
Inicializa una nueva instancia de la clase WeakRef.
WeakRef();
WeakRef(
decltype(__nullptr)
);
WeakRef(
_In_opt_ IWeakReference* ptr
);
WeakRef(
const ComPtr<IWeakReference>& ptr
);
WeakRef(
const WeakRef& ptr
);
WeakRef(
_Inout_ WeakRef&& ptr
);
Parámetros
ptr
Puntero, referencia o referencia rvalue a un objeto existente que inicializa el objeto WeakRef actual.
Comentarios
El primer constructor inicializa un objeto WeakRef vacío. El segundo constructor inicializa un objeto WeakRef desde un puntero a la interfaz IWeakReference. El tercer constructor inicializa un objeto WeakRef de una referencia a un objeto ComPtr<IWeakReference>. Los constructores cuarto y quinto inicializan un objeto WeakRef de otro objeto WeakRef.
WeakRef::~WeakRef destructor
Desinicializa la instancia actual de la clase WeakRef.
~WeakRef();
WeakRef::As
Establece el parámetro de puntero ComPtr especificado para representar la interfaz especificada.
template<typename U>
HRESULT As(
_Out_ ComPtr<U>* ptr
);
template<typename U>
HRESULT As(
_Out_ Details::ComPtrRef<ComPtr<U>> ptr
);
Parámetros
U
Id. de interfaz.
ptr
Cuando se completa esta operación, un objeto que representa el parámetro U.
Valor devuelto
S_OKsi esta operación es correcta; de lo contrario, un HRESULT que indica el motivo del error de la operación yptrse establece ennullptr.S_OKsi esta operación es correcta, pero el objetoWeakRefactual ya se ha liberado. El parámetroptrse establece ennullptr.S_OKsi esta operación se realiza correctamente, pero el objetoWeakRefactual no se deriva del parámetroU. El parámetroptrse establece ennullptr.
Comentarios
Se genera un error si el parámetro U es IWeakReference, o no se deriva de IInspectable.
La primera plantilla es el formulario que debe usar en el código. La segunda plantilla es una especialización del asistente interno, que admite características del lenguaje C++, como palabra clave de deducción de tipos auto.
A partir del SDK de Windows 10, este método no establece la instancia de WeakRef en nullptr si no se pudo obtener la referencia débil, por lo que debería evitar el código de comprobación de errores que comprueba WeakRef para nullptr. En su lugar, compruebe ptr para nullptr.
WeakRef::AsIID
Establece el parámetro de puntero ComPtr especificado para representar el identificador de interfaz especificado.
HRESULT AsIID(
REFIID riid,
_Out_ ComPtr<IInspectable>* ptr
);
Parámetros
riid
Id. de interfaz.
ptr
Cuando se completa esta operación, un objeto que representa el parámetro riid.
Valor devuelto
S_OKsi esta operación es correcta; de lo contrario, un HRESULT que indica el motivo del error de la operación yptrse establece ennullptr.S_OKsi esta operación es correcta, pero el objetoWeakRefactual ya se ha liberado. El parámetroptrse establece ennullptr.S_OKsi esta operación se realiza correctamente, pero el objetoWeakRefactual no se deriva del parámetroriid. El parámetroptrse establece ennullptr. Para obtener más información, vea la sección Comentarios.
Comentarios
Se genera un error si el parámetro riid no se deriva de IInspectable. Este error sustituye el valor devuelto.
La primera plantilla es el formulario que debe usar en el código. La segunda plantilla (no se muestra aquí, pero se declara en el archivo de encabezado) es una especialización del asistente interno, que admite características del lenguaje C++, como la palabra clave de deducción de tipos auto.
A partir del SDK de Windows 10, este método no establece la instancia de WeakRef en nullptr si no se pudo obtener la referencia débil, por lo que debería evitar el código de comprobación de errores que comprueba WeakRef para nullptr. En su lugar, busque ptr para nullptr.
WeakRef::CopyTo
Asigna un puntero a una interfaz, si está disponible, para la variable de puntero especificada.
HRESULT CopyTo(
REFIID riid,
_Deref_out_ IInspectable** ptr
);
template<typename U>
HRESULT CopyTo(
_Deref_out_ U** ptr
);
HRESULT CopyTo(
_Deref_out_ IWeakReference** ptr
);
Parámetros
U
Puntero a una interfaz IInspectable. Se genera un error si U no se deriva de IInspectable.
riid
Id. de interfaz. Se genera un error si riid no se deriva de IWeakReference.
ptr
Puntero indirecto doble a IInspectable o IWeakReference.
Valor devuelto
S_OK si se realiza correctamente; de lo contrario, un HRESULT que describe el error. Para obtener más información, vea Comentarios.
Comentarios
Un valor devuelto de S_OK significa que esta operación se realizó correctamente, pero no indica si la referencia débil se resolvió en una referencia segura. Si se devuelve S_OK, pruebe que ese parámetro ptr es una referencia segura; es decir, el parámetro ptr no es igual a nullptr.
A partir del SDK de Windows 10, este método no establece la instancia de WeakRef en nullptr si no se pudo obtener la referencia débil, por lo que debería evitar el código de comprobación de errores que comprueba WeakRef para nullptr. En su lugar, busque ptr para nullptr.
WeakRef::operator&
Devuelve un objeto ComPtrRef que representa el objeto WeakRef actual.
Details::ComPtrRef<WeakRef> operator&() throw()
Valor devuelto
Objeto ComPtrRef que representa el objeto WeakRef actual.
Comentarios
WeakRef::operator& es un operador auxiliar interno que no está diseñado para usarse en el código.