Freigeben über


Gewusst wie: Aktivieren und Verwenden einer Windows-Runtime-Komponente mit WRL

In diesem Dokument wird gezeigt, wie Sie mit Windows Runtime C++ Template Library (WRL) die Windows-Runtime initialisieren und eine Windows-Runtime-Komponente aktivieren und verwenden.

Hinweis

In diesem Beispiel wird eine integrierte Windows-Runtime-Komponente aktiviert.Wie Sie eine eigene Komponente erstellen, die Sie auf ähnliche Weise aktivieren können, erfahren Sie unter Exemplarische Vorgehensweise: Erstellen einer Basiskomponente für Windows-Runtime mit WRL.

Um eine Komponente zu verwenden, müssen Sie einen Schnittstellenzeiger auf den Typ abrufen, der von der Komponente implementiert wird. Und da die Windows-Runtime auf der COM-Technologie (Component Object Model) basiert, müssen Sie eine Instanz des Typs nach den COM-Regeln verwalten. Beispielsweise müssen Sie den Verweiszählerwert verwalten, der bestimmt, wann der Typ aus dem Speicher gelöscht wird.

Um die Verwendung der Windows-Runtime zu vereinfachen, stellt WRL die Vorlage für den intelligenten Zeigermechanismus, ComPtr<T>, bereit, mit der die Verweiszählung automatisch ausgeführt wird. Wenn Sie eine Variable deklarieren, geben Sie ComPtr<interface-name> identifier an. Um auf einen Schnittstellenmember zuzugreifen, wenden Sie den Pfeilmemberzugriffsoperator (->) auf den Bezeichner an.

Wichtig

Wenn Sie eine Schnittstellenfunktion aufrufen, testen Sie stets den Rückgabewert HRESULT.

Aktivieren und Verwenden einer Windows Runtime-Komponente

In den folgenden Schritten wird anhand der Windows::Foundation::IUriRuntimeClass-Schnittstelle veranschaulicht, wie Sie eine Aktivierungsfactory für eine Windows-Runtime-Komponente erstellen, eine Instanz dieser Komponente erstellen und einen Eigenschaftswert abrufen. Sie zeigen außerdem, wie die Windows-Runtime initialisiert wird. Im Folgenden finden Sie das vollständige Beispiel.

Wichtig

In der Regel verwenden Sie WRL in einer Windows Store-App; in diesem Beispiel wird jedoch zur Veranschaulichung eine Konsolen-App verwendet.Funktionen wie wprintf_s sind von einer Windows Store-App aus nicht verfügbar.Weitere Informationen über die Typen und Funktionen, die Sie in einer Windows Store-App verwenden können, finden Sie unter CRT-Funktionen nicht mit /ZW unterstützt und im Thema zu Win32 und COM für Windows Store-Apps.

So aktivieren und verwenden Sie eine Windows Runtime-Komponente

  1. Schließen Sie (mit #include) alle erforderlichen 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, den Code mithilfe der using namespace-Direktive in der CPP-Datei verständlicher zu gestalten.

  2. Initialisieren Sie den Thread, in dem die App ausgeführt wird. Jede App muss ihren Thread und ihr Threadingmodell initialisieren. In diesem Beispiel wird mithilfe der Klasse Microsoft::WRL::Wrappers::RoInitializeWrapper die Windows-Runtime initialisiert und RO_INIT_MULTITHREADED als Threadingmodell angegeben. Die RoInitializeWrapper-Klasse ruft Windows::Foundation::Initialize auf, wenn sie erstellt, und Windows::Foundation::Uninitialize, 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.

  3. Erstellen Sie eine Aktivierungsfactory für die ABI::Windows::Foundation::IUriRuntimeClassFactory-Schnittstelle.

    // 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 identifiziert Typen anhand von voll qualifizierten Namen. Der Parameter RuntimeClass_Windows_Foundation_Uri ist eine Zeichenfolge, die von Windows-Runtime bereitgestellt wird und den erforderlichen Ablaufklassennamen enthält.

  4. Initialisieren Sie 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 für eine Zeichenfolge, die von der Windows-Runtime verwendet wird, keinen Speicher. Stattdessen erstellt die Windows-Runtime eine Kopie der Zeichenfolge in einem Puffer, den sie verwaltet und für Vorgänge verwendet, und gibt ein Handle für den erstellten Puffer zurück.

  5. Erstellen Sie mit der IUriRuntimeClassFactory::CreateUri-Factorymethode ein ABI::Windows::Foundation::IUriRuntimeClass-Objekt.

    // Create the IUriRuntimeClass object.
    ComPtr<IUriRuntimeClass> uri;
    hr = uriFactory->CreateUri(uriHString.Get(), &uri);
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    
  6. Rufen Sie die IUriRuntimeClass::get_Domain-Methode auf, um den Wert der Domain-Eigenschaft abzurufen.

    // Get the domain part of the URI.
    HString domainName;
    hr = uri->get_Domain(domainName.GetAddressOf());
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    
  7. Drucken Sie den Domänennamen an die Konsole, und kehren Sie zurück. Alle ComPtr- und RAII-Objekte verlassen den Bereich und werden 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.
    

    Die WindowsGetStringRawBuffer-Funktion ruft das zugrunde liegende Unicode-Formular der URI-Zeichenfolge ab.

Im Folgenden sehen Sie 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

Zum Kompilieren kopieren Sie den Code, und fügen Sie ihn in ein Visual Studio-Projekt ein, oder fügen Sie ihn in eine Datei mit dem Namen wrl-consume-component.cpp ein, und führen Sie dann den folgenden Befehl in einem Visual Studio-Eingabeaufforderungsfenster aus.

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

Siehe auch

Konzepte

Windows Runtime C++ Template Library (WRL)