Partilhar 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 como ativar e usar um componente de Tempo de Execução do Windows .

Dica

Esse exemplo ativa um componente interno de Tempo de Execução do Windows .Para aprender a criar seu próprio componente que você pode alternar de maneira semelhante, consulte Instruções passo a passo: criando um componente básico de Tempo de Execução do Windows com WRL.

Para usar um componente, você deve adquirir um ponteiro de interface do tipo implementado pelo componente. E como a tecnologia subjacente de Tempo de Execução do Windows é o Component Object Model (COM), você deve seguir as regras de 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 é executado automaticamente a contagem de referência. Quando declara uma variável, especifique ComPtr<interface-name> identifier. Para acessar um membro da interface, aplicar o operador membros de acesso de seta (->) ao identificador.

Importante

Quando você chama uma função da interface, sempre teste 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 para um componente de Tempo de Execução do Windows , crie uma instância desse componente, além de recuperar um valor da propriedade. Também mostram como inicializar Tempo de Execução do Windows. O exemplo completo a seguir.

Importante

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

Para ativar e usar um componente de Tempo de Execução do Windows

  1. Inclua ()#includequalquer Tempo de Execução do Windowsnecessário, WRL, ou cabeçalhos de biblioteca padrão do 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 .cpp para tornar código mais legível.

  2. Inicializar o thread em que o aplicativo é executado. Cada aplicativo deve inicializar os threads e modelo de threading. Este exemplo usa a classe de Microsoft::WRL::Wrappers::RoInitializeWrapper para inicializar Tempo de Execução do Windows e especificá-la RO_INIT_MULTITHREADED como o modelo de threading. A classe de RoInitializeWrapper chama Windows::Foundation::Initialize na construçã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 a 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 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 e contém 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, 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 de, e então retornará 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. Imprime o nome de domínio no console e retornar. Qualquer ComPtr e os objetos de RAII permitem 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 recupera o formato subjacente Unicode de cadeia de caracteres do URI.

Aqui está o 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-a e cole-o em um projeto do Visual Studio, ou cole-o em um arquivo chamado wrl-consume-component.cpp e execute o comando a seguir 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)