다음을 통해 공유


방법: WRL을 사용하여 Windows 런타임 구성 요소 활성화 및 사용

이 문서를 사용 하는 방법을 보여 줍니다.를 Windows 런타임 C++ 템플릿 라이브러리 (WRL) 초기화 하는 Windows 런타임 활성화 및 사용 하는 Windows 런타임 구성 요소.

구성 요소를 사용 하려면 구성 요소에 의해 구현 되는 형식에 대 한 인터페이스 포인터를 얻어야 합니다.때문에 기술의의 Windows 런타임 되는 구성 요소 개체 모델 (COM) 형식의 인스턴스를 유지 관리 하는 COM 규칙을 따라야 합니다.예를 들어, 유지 관리 해야는 참조 횟수가 형식이 메모리에서 삭제 될 때를 결정 합니다.

사용을 단순화 하기는 Windows 런타임, WRL 스마트 포인터 템플릿을 제공 ComPtr <T>, 참조 횟수는 작업을 자동으로 수행 합니다.변수를 선언할 때 지정 ComPtr<인터페이스 이름을>식별자.인터페이스 멤버에 액세스 하려면 화살표 멤버 액세스 연산자를 적용 (->) 식별자입니다.

중요중요

인터페이스 함수를 호출할 때 항상 테스트는 HRESULT 값을 반환 합니다.

활성화 하 고 Windows 런타임 구성 요소를 사용 하 여

다음 단계에 따라 사용의 Windows::Foundation::IUriRuntimeClass 인터페이스는 정품 인증 공장을 만드는 방법을 보여 주기 위해는 Windows 런타임 구성 요소, 해당 구성 요소의 인스턴스를 만들고 속성 값을 검색 합니다.또한 초기화 하는 방법을 보여 줍니다 있는 Windows 런타임.다음은 완성된 예제입니다.

주의 정보주의

일반적으로 사용 되지만 WRL 에 있는 Windows 스토어 응용 프로그램,이 예제 그림을 사용 하 여 콘솔 응용 프로그램.같은 함수 wprintf_s 에서 사용할 수 없습니다는 Windows 스토어 응용 프로그램입니다.형식에 사용할 수 있는 함수에 대 한 자세한 inforomation에는 Windows 스토어 응용 프로그램 참조 하십시오 CRT 함수가 /zw에 지원 되지 않습니다Win32 및 Windows 저장소에 대 한 COM 응용 프로그램.

  1. 포함 (#include)은 필요한 Windows 런타임, WRL, 또는 표준 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;
    

    활용 하는 것이 좋습니다 있는 using namespace 지시문.cpp 파일에 코드를 쉽게 읽을 수 있도록 합니다.

  2. 응용 프로그램에서 실행 스레드를 초기화 합니다.모든 응용 프로그램의 스레드 및 스레딩 모델을 초기화 해야 합니다.예제는 Microsoft::WRL::Wrappers::RoInitializeWrapper 클래스를 초기화 하는 Windows 런타임 를 지정 하 고 RO_INIT_MULTITHREADED 스레딩 모델로.RoInitializeWrapper 클래스가 Windows::Foundation::Initialize 생성 시 및 Windows::Foundation::Uninitialize 소멸 시기.

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

    두 번째 문에서 RoInitializeWrapper::HRESULT 연산자 반환의 HRESULT 호출에서 Windows::Foundation::Initialize.

  3. 만들기는 정품 인증 공장 에 있는 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 런타임 정규화 된 이름을 사용 하 여 형식을 식별 합니다.RuntimeClass_Windows_Foundation_Uri 매개 변수에서 제공 하는 문자열입니다를 Windows 런타임 및 필요한 런타임 클래스 이름을 포함 합니다.

  4. 초기화는 Microsoft::WRL::Wrappers::HString 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);
    }
    

    에 Windows 런타임, 문자열에는 메모리를 할당 하지는 Windows 런타임 를 사용 합니다.대신에 Windows 런타임 작업을 사용 하 여 및 다음이 만든 핸들 버퍼에 반환 유지 하는 버퍼에 문자열의 복사본을 만듭니다.

  5. 사용 된 IUriRuntimeClassFactory::CreateUri 만들려면 팩터리 메서드는 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. 호출을 IUriRuntimeClass::get_Domain 의 값을 검색 하는 Domain 속성.

    // Get the domain part of the URI.
    HString domainName;
    hr = uri->get_Domain(domainName.GetAddressOf());
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    
  7. 도메인 이름을 콘솔에 출력 하 고 반환 합니다.모든 ComPtr 및 RAII 개체 범위를 두고 자동으로 해제 됩니다.

    // 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 함수 내부 유니코드 형태의 URI 문자열을 검색 합니다.

전체 예제는 다음과 같습니다.

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

코드 컴파일

코드를 컴파일하려면 복사한 다음 Visual Studio 프로젝트에 붙여 넣을 하거나 라는 파일에 붙여 넣을 wrl 소비 component.cpp 및 다음 Visual Studio 명령 프롬프트 창에서 다음 명령을 실행 합니다.

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

참고 항목

개념

Windows 런타임 C++ 템플릿 라이브러리(WRL)