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
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.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 wWindows::Foundation::Initialize
budowie iWindows::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 doWindows::Foundation::Initialize
.Utwórz fabrykę aktywacji dla interfejsu
ABI::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.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.
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); }
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); }
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)