Compartilhar via


Como ativar e usar um componente de Tempo de Execução do Windows com WRL

Este documento mostra como usar Biblioteca em Tempo de Execução C++ do Tempo de Execução do Windows (WRL) para inicializar Tempo de Execução do Windows e para ativar e usar um componente de Tempo de Execução do Windows .

Para usar um componente, você deve adquirir um ponteiro de interface para o tipo que é implementado pelo componente.E porque a tecnologia subjacente de Tempo de Execução do Windows é o Component Object Model, (COM) você deve seguir as regras COM para manter uma instância do tipo.Por exemplo, você deve manter a contagem de referência que determina quando o tipo é excluído de memória.

Para simplificar o uso de Tempo de Execução do Windows, WRL fornece o modelo inteligente do ponteiro, ComPtr<T>, que executa automaticamente contagem de referência.Quando você declara uma variável, especifique ComPtr<- nome>identificador.Para acessar um membro de interface, aplique o operador de acesso a membro ()->de seta para o identificador.

Observação importanteImportante

Quando você chamar uma função de interface, sempre testar o valor de retorno de HRESULT .

Ativando e usando um componente de Tempo de Execução do Windows

As etapas a seguir usam a interface de Windows::Foundation::IUriRuntimeClass para demonstrar como criar uma fábrica de ativação de um componente de Tempo de Execução do Windows , crie uma instância do componente, e recuperam um valor de propriedade.Eles também mostram como inicializar Tempo de Execução do Windows.O exemplo completo maneira.

Observação de cuidadoCuidado

Embora você normalmente usa WRL em um aplicativo de Windows Store , este exemplo usa um aplicativo de console para a ilustração.As funções como wprintf_s não estão disponíveis de um aplicativo de Windows Store .Para mais inforomation sobre os tipos e funções que você pode usar em um aplicativo de Windows Store , consulte Funções de CRT não suportadas com /ZW e O Win32 e COM para aplicativos da Windows Store.

  1. Inclua ()#includequalquer Tempo de Execução do Windowsnecessário, WRL, ou cabeçalhos padrão da biblioteca 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 que você utiliza a política de using namespace no arquivo de .cpp para tornar o código mais legível.

  2. Inicializar o thread em que o aplicativo é executado.Cada aplicativo deve inicializar seus segmento e modelo.Este exemplo usa a classe de Microsoft::WRL::Wrappers::RoInitializeWrapper para inicializar Tempo de Execução do Windows e especifica RO_INIT_MULTITHREADED como o modelo.A classe de RoInitializeWrapper chama Windows::Foundation::Initialize na compilação, e Windows::Foundation::Uninitialize quando é destruída.

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

    Na segunda instrução, o operador de RoInitializeWrapper::HRESULT retorna HRESULT de chamada para Windows::Foundation::Initialize.

  3. Crie uma fábrica de ativação para a interface 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);
    }
    

    Os nomes totalmente qualificados dos usos de Tempo de Execução do Windows para identificar tipos.O parâmetro de RuntimeClass_Windows_Foundation_Uri é uma cadeia de caracteres que é fornecida por Tempo de Execução do Windows contendo o nome da classe necessário em tempo de execução.

  4. Inicializar uma variável de Microsoft::WRL::Wrappers::HString que representa o 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);
    }
    

    Em Tempo de Execução do Windows, você não aloca memória para uma cadeia de caracteres que Tempo de Execução do Windows use.Em vez disso, Tempo de Execução do Windows cria uma cópia da cadeia de caracteres em um buffer que mantém e use para operações e em seguida, retorna um identificador para o buffer que criou.

  5. Use o método de fábrica de IUriRuntimeClassFactory::CreateUri para criar um 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. Chame o método de IUriRuntimeClass::get_Domain para recuperar o valor da propriedade 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 o nome de domínio para o console e retornar.Qualquer ComPtr e objetos de RAII deixe o escopo e são liberados automaticamente.

    // 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 A função retorna o formulário base Unicode de cadeia de caracteres URI.

Aqui está um exemplo 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
*/

Compilando o código

Para compilar o código, copie e cole em um projeto Visual Studio, ou cole em um arquivo denominado wrl-consume-component.cpp e execute o seguinte comando em uma janela de prompt de comando do Visual Studio.

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

Consulte também

Conceitos

Biblioteca de Modelos C++ do Tempo de Execução do Windows (WRL)