Compartir a través de


Cómo: Activar y usar un componente de Windows en tiempo de ejecución mediante WRL

En este documento se muestra cómo utilizar Biblioteca de plantillas de Windows Runtime C++ (WRL) para inicializar Windows en tiempo de ejecución y activar y utilizar un componente de Windows en tiempo de ejecución.

Para utilizar un componente, debe adquirir un puntero de interfaz al tipo implementado por el componente.Y porque la tecnología subyacente de Windows en tiempo de ejecución es el modelo de objetos componentes (COM), debe seguir reglas COM para mantener una instancia del tipo.Por ejemplo, debe mantener el recuento de referencias que determina cuando elimine el tipo de memoria.

Para simplificar el uso de Windows en tiempo de ejecución, WRL proporciona la plantilla de puntero inteligente, ComPtr<T>, que realizan automáticamente el recuento de referencias.Cuando declara una variable, especifique ComPtr<interfaz-nombre>identificador.Para tener acceso a un miembro de interfaz, aplique el operador de acceso a miembros de flecha (->) al identificador.

Nota importanteImportante

Cuando se llama a una función de interfaz, siempre pruebe el valor devuelto de HRESULT.

El provocar y Utilizar un componente en tiempo de ejecución de Windows

Los pasos siguientes utilizan la interfaz de Windows::Foundation::IUriRuntimeClass para mostrar cómo crear un generador de activación para un componente de Windows en tiempo de ejecución, cree una instancia de ese componente, y recuperar un valor de propiedad.También se muestra cómo inicializar Windows en tiempo de ejecución.A continuación se muestra el ejemplo completo.

Nota de precauciónPrecaución

Aunque use normalmente WRL en una aplicación de Tienda Windows, este ejemplo utiliza una aplicación de consola a la ilustración.Las funciones como wprintf_s no están disponibles de una aplicación de Tienda Windows.Para obtener más inforomation sobre los tipos y funciones que puede utilizar en una aplicación de Tienda Windows, vea Funciones CRT no compatibles con /ZW y Win32 y COM para las aplicaciones del almacén de Windows.

  1. Incluya (#include) cualquier Windows en tiempo de ejecución necesario, WRL, o encabezado de la biblioteca estándar de 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;
    

    Recomendamos utilizar la directiva de using namespace en el archivo .cpp para hacer el código más legible.

  2. Inicializa el subproceso en el que se ejecuta la aplicación.Cada aplicación debe inicializar el subproceso y modelo de subprocesos.Este ejemplo utiliza la clase de Microsoft::WRL::Wrappers::RoInitializeWrapper para inicializar Windows en tiempo de ejecución y especifica RO_INIT_MULTITHREADED como el modelo de subprocesos.La clase de RoInitializeWrapper llama Windows::Foundation::Initialize en la construcción, y Windows::Foundation::Uninitialize cuando se destruye.

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

    En la segunda instrucción, el operador de RoInitializeWrapper::HRESULT devuelve HRESULT de la llamada a Windows::Foundation::Initialize.

  3. Cree un generador de activación para la interfaz de 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);
    }
    

    Windows en tiempo de ejecución utiliza nombres completos para identificar tipos.El parámetro de RuntimeClass_Windows_Foundation_Uri es una cadena proporcionada por Windows en tiempo de ejecución y contiene el nombre de clase necesario en tiempo de ejecución.

  4. Inicializa una variable de Microsoft::WRL::Wrappers::HString que representa el URI "https://www.microsoft.com".

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

    En Windows en tiempo de ejecución, no asigna memoria para una cadena que Windows en tiempo de ejecución utilice.En su lugar, Windows en tiempo de ejecución crea una copia de la cadena en un búfer que mantiene y utilice para las operaciones, y devuelve un identificador al búfer que creó.

  5. Utilice el método del generador de IUriRuntimeClassFactory::CreateUri para crear un objeto de ABI::Windows::Foundation::IUriRuntimeClass.

    // Create the IUriRuntimeClass object.
    ComPtr<IUriRuntimeClass> uri;
    hr = uriFactory->CreateUri(uriHString.Get(), &uri);
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    
  6. Llame al método de IUriRuntimeClass::get_Domain para recuperar el valor de la propiedad de Domain.

    // Get the domain part of the URI.
    HString domainName;
    hr = uri->get_Domain(domainName.GetAddressOf());
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    
  7. Imprimir el nombre de dominio en la consola y vuelva.Todo el ComPtr y objetos RAII permiten ámbito y se libera automáticamente.

    // 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 La función recupera el formulario subyacente Unicode de cadena URI.

A continuación se muestra el ejemplo completo:

// 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
*/

Compilar el código

Para compilar el código, cópielo y péguelo en un proyecto de Visual Studio, o péguelo en un archivo denominado wrl-consume-component.cpp y después se ejecute el siguiente comando en una ventana de símbolo del sistema de Visual Studio.

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

Vea también

Conceptos

Biblioteca de plantillas de Windows Runtime C++ (WRL)