Klasa WeakRef

Reprezentuje słabe odwołanie, które może być używane tylko przez środowisko wykonawcze systemu Windows, a nie klasyczny COM. Słabe odwołanie reprezentuje obiekt, który może lub nie jest dostępny.

Składnia

class WeakRef : public ComPtr<IWeakReference>;

Członkowie

Konstruktory publiczne

Nazwa/nazwisko opis
WeakRef::WeakRef Konstruktor Inicjuje nowe wystąpienie klasy WeakRef.
WeakRef::~WeakRef Destruktora Deinitializuje bieżące wystąpienie WeakRef klasy.

Metody publiczne

Nazwa/nazwisko opis
WeakRef::As Ustawia określony ComPtr parametr wskaźnika do reprezentowania określonego interfejsu.
WeakRef::AsIID Ustawia określony ComPtr parametr wskaźnika, aby reprezentować określony identyfikator interfejsu.
WeakRef::CopyTo Przypisuje wskaźnik do interfejsu, jeśli jest dostępny, do określonej zmiennej wskaźnika.

Operatory publiczne

Nazwa/nazwisko opis
WeakRef::operator& ComPtrRef Zwraca obiekt reprezentujący bieżący WeakRef obiekt.

Uwagi

Obiekt WeakRef utrzymuje silne odwołanie, które jest skojarzone z obiektem i może być prawidłowe lub nieprawidłowe. Wywołaj metodę As() or AsIID() , aby uzyskać silne odwołanie. Jeśli silne odwołanie jest prawidłowe, może uzyskać dostęp do skojarzonego obiektu. Jeśli silne odwołanie jest nieprawidłowe (nullptr), skojarzony obiekt jest niedostępny.

WeakRef Obiekt jest zwykle używany do reprezentowania obiektu, którego istnienie jest kontrolowane przez wątek zewnętrzny lub aplikację. Na przykład skonstruuj WeakRef obiekt z odwołania do obiektu pliku. Gdy plik jest otwarty, silne odwołanie jest prawidłowe. Jeśli jednak plik zostanie zamknięty, silne odwołanie stanie się nieprawidłowe.

W zestawie SDK systemu Windows występuje zmiana zachowania w Asmetodach , AsIIDi CopyTo . Wcześniej, po wywołaniu dowolnej z tych metod, można sprawdzić WeakRefnullptr , czy silne odwołanie zostało pomyślnie uzyskane, jak w poniższym kodzie:

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!");
}

Powyższy kod nie działa w przypadku korzystania z zestawu Windows 10 SDK (lub nowszego). Zamiast tego sprawdź wskaźnik, który został przekazany dla elementu nullptr.

if (strongRef == nullptr)
{
    wprintf(L"Couldn't get strong ref!");
}

Hierarchia dziedziczenia

ComPtr
 └ WeakRef

Wymagania

Nagłówka:client.h

Obszaru nazw:Microsoft::WRL

WeakRef::WeakRef Konstruktor

Inicjuje nowe wystąpienie klasy WeakRef.

WeakRef();
WeakRef(
   decltype(__nullptr)
);

WeakRef(
   _In_opt_ IWeakReference* ptr
);

WeakRef(
   const ComPtr<IWeakReference>& ptr
);

WeakRef(
   const WeakRef& ptr
);

WeakRef(
   _Inout_ WeakRef&& ptr
);

Parametry

ptr
Wskaźnik, odwołanie lub odwołanie rvalue do istniejącego obiektu, który inicjuje bieżący WeakRef obiekt.

Uwagi

Pierwszy konstruktor inicjuje pusty WeakRef obiekt. Drugi konstruktor inicjuje WeakRef obiekt ze wskaźnika do interfejsu IWeakReference . Trzeci konstruktor inicjuje WeakRef obiekt z odwołania do ComPtr<IWeakReference> obiektu. Czwarte i piąte konstruktory inicjują WeakRef obiekt z innego WeakRef obiektu.

WeakRef::~WeakRef Destruktora

Deinitializuje bieżące wystąpienie WeakRef klasy.

~WeakRef();

WeakRef::As

Ustawia określony ComPtr parametr wskaźnika do reprezentowania określonego interfejsu.

template<typename U>
HRESULT As(
   _Out_ ComPtr<U>* ptr
);

template<typename U>
HRESULT As(
   _Out_ Details::ComPtrRef<ComPtr<U>> ptr
);

Parametry

U
Identyfikator interfejsu.

ptr
Po zakończeniu tej operacji obiekt reprezentujący parametr U.

Wartość zwracana

  • S_OK jeśli ta operacja powiedzie się; w przeciwnym razie hrESULT wskazujący przyczynę niepowodzenia operacji i ptr jest ustawiona na nullptrwartość .

  • S_OK jeśli ta operacja zakończy się pomyślnie, ale bieżący WeakRef obiekt został już zwolniony. Parametr ptr jest ustawiony na nullptrwartość .

  • S_OK jeśli ta operacja powiedzie się, ale bieżący WeakRef obiekt nie pochodzi z parametru U. Parametr ptr jest ustawiony na nullptrwartość .

Uwagi

Błąd jest emitowany, jeśli parametr U to IWeakReference, lub nie pochodzi z IInspectable.

Pierwszy szablon to formularz, którego należy użyć w kodzie. Drugi szablon to wewnętrzna specjalizacja pomocnika; obsługuje funkcje języka C++, takie jak słowo kluczowe odliczenia auto typu.

Począwszy od zestawu WINDOWS 10 SDK, ta metoda nie ustawia WeakRef wystąpienia na nullptr wartość , jeśli nie można uzyskać słabego odwołania, dlatego należy unikać sprawdzania błędów kodu, który sprawdza WeakRef wartość .nullptr Zamiast tego sprawdź ptr dla nullptr.

WeakRef::AsIID

Ustawia określony ComPtr parametr wskaźnika, aby reprezentować określony identyfikator interfejsu.

HRESULT AsIID(
   REFIID riid,
   _Out_ ComPtr<IInspectable>* ptr
);

Parametry

riid
Identyfikator interfejsu.

ptr
Po zakończeniu tej operacji obiekt reprezentujący parametr riid.

Wartość zwracana

  • S_OK jeśli ta operacja powiedzie się; w przeciwnym razie hrESULT wskazujący przyczynę niepowodzenia operacji i ptr jest ustawiona na nullptrwartość .

  • S_OK jeśli ta operacja zakończy się pomyślnie, ale bieżący WeakRef obiekt został już zwolniony. Parametr ptr jest ustawiony na nullptrwartość .

  • S_OK jeśli ta operacja powiedzie się, ale bieżący WeakRef obiekt nie pochodzi z parametru riid. Parametr ptr jest ustawiony na nullptrwartość . (Aby uzyskać więcej informacji, zobacz Uwagi).

Uwagi

Błąd jest emitowany, jeśli parametr riid nie pochodzi z IInspectableelementu . Ten błąd zastępuje wartość zwracaną.

Pierwszy szablon to formularz, którego należy użyć w kodzie. Drugi szablon (nie pokazany tutaj, ale zadeklarowany w pliku nagłówka) jest wewnętrzną specjalizacją pomocnika, która obsługuje funkcje języka C++, takie jak auto słowo kluczowe odliczenia typu.

Począwszy od zestawu WINDOWS 10 SDK, ta metoda nie ustawia WeakRef wystąpienia na nullptr wartość , jeśli nie można uzyskać słabego odwołania, dlatego należy unikać sprawdzania błędów kodu, który sprawdza WeakRef wartość .nullptr Zamiast tego sprawdź ptrnullptrwartość .

WeakRef::CopyTo

Przypisuje wskaźnik do interfejsu, jeśli jest dostępny, do określonej zmiennej wskaźnika.

HRESULT CopyTo(
   REFIID riid,
   _Deref_out_ IInspectable** ptr
);

template<typename U>
HRESULT CopyTo(
   _Deref_out_ U** ptr
);

HRESULT CopyTo(
   _Deref_out_ IWeakReference** ptr
);

Parametry

U
Wskaźnik interfejsu IInspectable . Błąd jest emitowany, jeśli U nie pochodzi z IInspectableelementu .

riid
Identyfikator interfejsu. Błąd jest emitowany, jeśli riid nie pochodzi z IWeakReferenceelementu .

ptr
Podwójnie pośredni wskaźnik do IInspectable lub IWeakReference.

Wartość zwracana

S_OK w przypadku powodzenia; w przeciwnym razie HRESULT opisujący błąd. Aby uzyskać więcej informacji, zobacz Uwagi.

Uwagi

Wartość zwracana S_OK oznacza, że operacja powiodła się, ale nie wskazuje, czy słabe odwołanie zostało rozpoznane jako silne odwołanie. Jeśli S_OK zostanie zwrócony, przetestuj, że parametr ptr jest silnym odwołaniem; oznacza to, że parametr ptr nie jest równy nullptr.

Począwszy od zestawu SDK systemu Windows 10, ta metoda nie ustawia WeakRef wystąpienia na nullptr wartość , jeśli nie można uzyskać słabego odwołania, dlatego należy unikać sprawdzania kodu błędu sprawdzającegoWeakRef, który sprawdza wartość .nullptr Zamiast tego sprawdź ptrnullptrwartość .

WeakRef::operator&

ComPtrRef Zwraca obiekt reprezentujący bieżący WeakRef obiekt.

Details::ComPtrRef<WeakRef> operator&() throw()

Wartość zwracana

ComPtrRef Obiekt reprezentujący bieżący WeakRef obiekt.

Uwagi

WeakRef::operator& to wewnętrzny operator pomocnika, który nie ma być używany w kodzie.