Porady: uaktywnianie składnika środowiska wykonawczego systemu Windows za pomocą biblioteki WRL i korzystanie z niego

W tym dokumencie pokazano, jak za pomocą biblioteki szablonów języka środowisko wykonawcze systemu Windows C++ (WRL) zainicjować środowisko wykonawcze systemu Windows oraz jak aktywować i używać składnika środowisko wykonawcze systemu Windows.

Aby użyć składnika, należy uzyskać wskaźnik interfejsu do typu implementowany przez składnik. Ponieważ podstawową technologią środowisko wykonawcze systemu Windows jest model obiektów składowych (COM), należy postępować zgodnie z regułami MODELU COM, aby zachować wystąpienie typu. Na przykład należy zachować liczbę odwołań, która określa, kiedy typ jest usuwany z pamięci.

Aby uprościć korzystanie z środowisko wykonawcze systemu Windows, biblioteka szablonów języka środowisko wykonawcze systemu Windows C++ udostępnia inteligentny szablon wskaźnika ComPtr<T>, który automatycznie wykonuje zliczanie odwołań. Podczas deklarowania zmiennej określ ComPtr<identyfikator nazwy>interfejsu. Aby uzyskać dostęp do elementu członkowskiego interfejsu, zastosuj do identyfikatora operator dostępu do elementu członkowskiego strzałki (->).

Ważne

Po wywołaniu funkcji interfejsu zawsze przetestuj wartość zwracaną HRESULT.

Aktywowanie i używanie składnika środowisko wykonawcze systemu Windows

W poniższych krokach pokazano, Windows::Foundation::IUriRuntimeClass jak utworzyć fabrykę aktywacji dla składnika środowisko wykonawcze systemu Windows, utworzyć wystąpienie tego składnika i pobrać wartość właściwości. Pokazują również, jak zainicjować środowisko wykonawcze systemu Windows. Poniższy kompletny przykład.

Ważne

Chociaż zazwyczaj używasz biblioteki szablonów języka C++ środowisko wykonawcze systemu Windows w aplikacji platformy platforma uniwersalna systemu Windows (UWP), w tym przykładzie użyto aplikacji konsolowej na potrzeby ilustracji. Funkcje, takie jak wprintf_s nie są dostępne w aplikacji platformy UNIWERSALNEJ systemu Windows. Aby uzyskać więcej informacji na temat typów i funkcji, których można używać w aplikacji platformy UNIWERSALNEJ systemu Windows, zobacz Funkcje CRT nieobsługiwane w aplikacjach platforma uniwersalna systemu Windows i Win32 i COM dla aplikacji platformy UWP.

Aby aktywować składnik środowisko wykonawcze systemu Windows i korzystać z niego

  1. Uwzględnij (#include) wszystkie wymagane środowisko wykonawcze systemu Windows, bibliotekę szablonów języka C++ środowisko wykonawcze systemu Windows lub nagłówki standardowej biblioteki języka C++.

    #include <Windows.Foundation.h>
    #include <wrl\wrappers\corewrappers.h>
    #include <wrl\client.h>
    #include <stdio.h>
    
    using namespace ABI::Windows::Foundation;
    using namespace Microsoft::WRL;
    using namespace Microsoft::WRL::Wrappers;
    

    Zalecamy użycie using namespace dyrektywy w pliku cpp, aby kod był bardziej czytelny.

  2. Zainicjuj wątek, w którym jest wykonywana aplikacja. Każda aplikacja musi zainicjować swój model wątków i wątków. W tym przykładzie użyto klasy Microsoft::WRL::Wrappers::RoInitializeWrapper, aby zainicjować środowisko wykonawcze systemu Windows i określa RO_INIT_MULTITHREADED jako model wątkowania. Klasa RoInitializeWrapper wywołuje w Windows::Foundation::Initialize budowie i Windows::Foundation::Uninitialize kiedy zostanie zniszczona.

    // Initialize the Windows Runtime.
    RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);
    if (FAILED(initialize))
    {
        return PrintError(__LINE__, initialize);
    }
    

    W drugiej instrukcji operator RoInitializeWrapper::HRESULT zwraca HRESULT wartość z wywołania do Windows::Foundation::Initialize.

  3. Utwórz fabrykę aktywacji dla interfejsuABI::Windows::Foundation::IUriRuntimeClassFactory.

    // Get the activation factory for the IUriRuntimeClass interface.
    ComPtr<IUriRuntimeClassFactory> uriFactory;
    HRESULT hr = GetActivationFactory(HStringReference(RuntimeClass_Windows_Foundation_Uri).Get(), &uriFactory);
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    

    Środowisko wykonawcze systemu Windows używa w pełni kwalifikowanych nazw do identyfikowania typów. Parametr RuntimeClass_Windows_Foundation_Uri jest ciągiem dostarczonym przez środowisko wykonawcze systemu Windows i zawiera wymaganą nazwę klasy środowiska uruchomieniowego.

  4. Zainicjuj zmienną Microsoft::WRL::Wrappers::HString reprezentującą identyfikator URI "https://www.microsoft.com".

    // Create a string that represents a URI.
    HString uriHString;
    hr = uriHString.Set(L"http://www.microsoft.com");
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    

    W środowisko wykonawcze systemu Windows nie przydzielasz pamięci dla ciągu, którego będzie używać środowisko wykonawcze systemu Windows. Zamiast tego środowisko wykonawcze systemu Windows tworzy kopię ciągu w buforze, który obsługuje i używa do operacji, a następnie zwraca uchwyt do utworzonego buforu.

  5. IUriRuntimeClassFactory::CreateUri Użyj metody factory, aby utworzyć ABI::Windows::Foundation::IUriRuntimeClass obiekt.

    // Create the IUriRuntimeClass object.
    ComPtr<IUriRuntimeClass> uri;
    hr = uriFactory->CreateUri(uriHString.Get(), &uri);
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    
  6. Wywołaj metodę , IUriRuntimeClass::get_Domain aby pobrać wartość Domain właściwości.

    // Get the domain part of the URI.
    HString domainName;
    hr = uri->get_Domain(domainName.GetAddressOf());
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    
  7. Wydrukuj nazwę domeny do konsoli i wróć. Wszystkie ComPtr obiekty RAII opuszczają zakres i są zwalniane automatycznie.

    // Print the domain name and return.
    wprintf_s(L"Domain name: %s\n", domainName.GetRawBuffer(nullptr));
    
    // All smart pointers and RAII objects go out of scope here.
    

    Funkcja WindowsGetStringRawBuffer pobiera podstawowy formularz Unicode ciągu identyfikatora URI.

Oto kompletny przykład:

// wrl-consume-component.cpp
// compile with: runtimeobject.lib
#include <Windows.Foundation.h>
#include <wrl\wrappers\corewrappers.h>
#include <wrl\client.h>
#include <stdio.h>

using namespace ABI::Windows::Foundation;
using namespace Microsoft::WRL;
using namespace Microsoft::WRL::Wrappers;

// Prints an error string for the provided source code line and HRESULT
// value and returns the HRESULT value as an int.
int PrintError(unsigned int line, HRESULT hr)
{
    wprintf_s(L"ERROR: Line:%d HRESULT: 0x%X\n", line, hr);
    return hr;
}

int wmain()
{
    // Initialize the Windows Runtime.
    RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);
    if (FAILED(initialize))
    {
        return PrintError(__LINE__, initialize);
    }

    // Get the activation factory for the IUriRuntimeClass interface.
    ComPtr<IUriRuntimeClassFactory> uriFactory;
    HRESULT hr = GetActivationFactory(HStringReference(RuntimeClass_Windows_Foundation_Uri).Get(), &uriFactory);
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }

    // Create a string that represents a URI.
    HString uriHString;
    hr = uriHString.Set(L"http://www.microsoft.com");
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }

    // Create the IUriRuntimeClass object.
    ComPtr<IUriRuntimeClass> uri;
    hr = uriFactory->CreateUri(uriHString.Get(), &uri);
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }

    // Get the domain part of the URI.
    HString domainName;
    hr = uri->get_Domain(domainName.GetAddressOf());
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }

    // Print the domain name and return.
    wprintf_s(L"Domain name: %s\n", domainName.GetRawBuffer(nullptr));

    // All smart pointers and RAII objects go out of scope here.
}
/*
Output:
Domain name: microsoft.com
*/

Kompilowanie kodu

Aby skompilować kod, skopiuj go, a następnie wklej go w projekcie programu Visual Studio lub wklej go w pliku o nazwie wrl-consume-component.cpp , a następnie uruchom następujące polecenie w oknie wiersza polecenia programu Visual Studio.

cl.exe wrl-consume-component.cpp runtimeobject.lib

Zobacz też

Biblioteka szablonów języka C++ środowiska uruchomieniowego systemu Windows (WRL)