Gewusst wie: Aktivieren und Verwenden einer Windows-Runtime-Komponente mit WRL
Dieses Dokument, wie Windows Runtime C++ Template Library (WRL) zum Windows-Runtime zu initialisieren und eine Windows-Runtime Komponente zu aktivieren und zu verwenden.
Um eine Komponente zu verwenden, müssen Sie einen Schnittstellenzeiger in den Typ abrufen der von der Komponente implementiert wird.Und da die zugrunde liegende Technologie Windows-Runtime das COM (Component Object Model) handelt, müssen Sie nach folgen, eine Instanz des Typs beizubehalten.Beispielsweise müssen Sie den Verweiszähler beibehalten, der bestimmt, wann der Typ aus dem Arbeitsspeicher gelöscht wird.
Um die Verwendung Windows-Runtime zu vereinfachen, stellt WRL die Vorlage des intelligenten Zeigermechanismus, ComPtr<T>, die automatisch Verweiszählung ausführt.Wenn Sie eine Variable deklarieren, geben Sie ComPtr<SchnittstelleName>Bezeichner an.Um einen Schnittstellenmember zuzugreifen, wenden Sie den Pfeilmemberzugriffsoperator (->) auf den Bezeichner.
Wichtig |
---|
Wenn Sie eine Schnittstellenfunktion aufrufen, testen Sie immer den HRESULT Rückgabewert. |
Einer Windows Runtime-Komponente aktivieren und mit
Die folgenden Schritte Windows::Foundation::IUriRuntimeClass verwenden die - Schnittstelle, um zu zeigen, wie eine Aktivierungsfactory für eine Windows-Runtime Komponente erstellt wird, erstellt eine Instanz dieser Komponente und rufen einen Eigenschaftswert ab.Außerdem wird gezeigt, wie Windows-Runtime initialisiert.Im Folgenden finden Sie das vollständige Beispiel.
Vorsicht |
---|
Obwohl Sie in der Regel WRL in einer Windows Store-App, verwenden Sie dieses Beispiels eine Konsolen-App zur Veranschaulichung.Funktionen wie wprintf_s sind nicht von einer Windows Store-App verfügbar.Weitere inforomation über die Typen und die Funktionen, die Sie in einer Windows Store-App verwenden können, finden Sie unter CRT-Funktionen unterstützt nicht mit /ZW und Win32 und COM für Windows Store-Apps. |
Schließen Sie (#include) jede erforderliche Windows-Runtime, WRL oder Standard-C++-Bibliotheksheader ein.
#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;
Es wird empfohlen, die using namespace-Direktiven in der CPP-Datei verwenden, um den Code verständlicher zu gestalten.
Initialisieren Sie den Thread, in dem die Anwendung ausgeführt wird.Jede Anwendung muss den Thread und Threadingmodell initialisieren.In diesem Beispiel wird die Microsoft::WRL::Wrappers::RoInitializeWrapper-Klasse, um Windows-Runtime zu initialisieren und gibt RO_INIT_MULTITHREADED als das Threadingmodell an.Die RoInitializeWrapper-Klasse ruft Windows::Foundation::Initialize an der Erstellung und Windows::Foundation::Uninitialize auf, wenn sie zerstört wird.
// Initialize the Windows Runtime. RoInitializeWrapper initialize(RO_INIT_MULTITHREADED); if (FAILED(initialize)) { return PrintError(__LINE__, initialize); }
In der zweiten Anweisung gibt der Operator RoInitializeWrapper::HRESULTHRESULT vom Aufruf von Windows::Foundation::Initialize zurück.
Erstellen Sie eine Aktivierungsfactory für die ABI::Windows::Foundation::IUriRuntimeClassFactory-Schnittstelle erstellt.
// 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); }
Die Windows-Runtime Verwendungsvollqualifizierten namen, von Typen identifizieren.Der RuntimeClass_Windows_Foundation_Uri-Parameter ist eine Zeichenfolge, die von Windows-Runtime bereitgestellt und den erforderlichen Ablaufklassennamen enthält.
Initialisiert eine Microsoft::WRL::Wrappers::HString-Variable, die den URI "https://www.microsoft.com" darstellt.
// Create a string that represents a URI. HString uriHString; hr = uriHString.Set(L"https://www.microsoft.com"); if (FAILED(hr)) { return PrintError(__LINE__, hr); }
In Windows-Runtime belegen Sie nicht für eine Zeichenfolge Speicher die Windows-Runtime verwendet.Stattdessen erstellt Windows-Runtime eine Kopie der Zeichenfolge in einem Puffer, den sie für Vorgänge verwaltet und verwendet, und gibt ein Handle für den Puffer zurück, den sie erstellt wurden.
Verwenden Sie die IUriRuntimeClassFactory::CreateUri Factorymethode, um ein ABI::Windows::Foundation::IUriRuntimeClass-Objekt zu erstellen.
// Create the IUriRuntimeClass object. ComPtr<IUriRuntimeClass> uri; hr = uriFactory->CreateUri(uriHString.Get(), &uri); if (FAILED(hr)) { return PrintError(__LINE__, hr); }
Rufen Sie die IUriRuntimeClass::get_Domain-Methode auf, um den Wert der - Eigenschaft Domain abzurufen.
// Get the domain part of the URI. HString domainName; hr = uri->get_Domain(domainName.GetAddressOf()); if (FAILED(hr)) { return PrintError(__LINE__, hr); }
Drucken Sie den Domänennamen in der Konsole und zurückgeben.Alle ComPtr und RAII-Objekturlaub bewerten und automatisch freigegeben.
// 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.
WindowsGetStringRawBuffer Die Funktion ruft das zugrunde liegende Unicode-Formular der URI-Zeichenfolge ab.
Hier ist das vollständige Beispiel:
// 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"https://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
*/
Kompilieren des Codes
So kompilieren Sie den Code, ihn kopieren und in einem Visual Studio-Projekt dann einfügen, oder fügen Sie ihn in eine Datei einfügen, die wrl-consume-component.cpp namens und dann den folgenden Befehl in einem Visual Studio-Eingabeaufforderungsfenster ausgeführt.
cl.exe wrl-consume-component.cpp runtimeobject.lib