다음을 통해 공유


방법: 직접 WRL 구성 요소 인스턴스화

사용 하는 방법에 알아봅니다.는 Windows 런타임 C++ 템플릿 라이브러리 (WRL) Microsoft::WRL::MakeMicrosoft::WRL::Details::MakeAndInitialize 함수를 정의 하는 모듈에서 구성 요소를 인스턴스화할 수 있습니다.

클래스 팩터리 또는 기타 메커니즘이 필요 하지 않은 구성 요소를 직접 인스턴스화하고 오버 헤드가 줄일 수 있습니다.둘 다에서 직접 구성 요소를 인스턴스화할 수 있습니다 Windows 스토어 응용 프로그램 및 데스크톱 응용 프로그램에서.

사용 하는 방법을 알아보려면 기본을 만들 수 Windows 런타임 구성 요소 및 외부에서 인스턴스화할 Windows 스토어 응용 프로그램을 참조 하십시오 연습: WRL을 사용하여 기본 Windows 런타임 구성 요소 만들기.사용 하는 방법을 알아보려면 WRL 클래식 COM 구성 요소를 만들고 외부 데스크톱 응용 프로그램에서 인스턴스화할 보려면 방법: WRL을 사용하여 기본 COM 구성 요소 만들기.

이 문서의 두 가지 예제를 보여 줍니다.첫 번째 예제를 사용 하는 Make 함수는 구성 요소를 인스턴스화할 수 있습니다.두 번째 예제는 MakeAndInitialize 함수를 생성 하는 동안 실패할 수 있는 구성 요소를 인스턴스화합니다.(일반적으로 COM을 사용 하기 때문에 HRESULT 오류를 나타내는 예외를 대신 값을 COM 형식이 일반적으로 throw 하지 않습니다 해당 생성자에서 합니다.MakeAndInitialize건설 인수를 통해 유효성을 검사할 구성 요소 사용은 RuntimeClassInitialize 메서드입니다.) 두 예제 모두 기본로 거 인터페이스를 정의 하 고 콘솔에 메시지를 작성 하는 클래스를 정의 하 여 해당 인터페이스를 구현 합니다.

중요중요

사용할 수 없습니다는 new 연산자를 인스턴스화할 수 WRL 구성 요소입니다.따라서 항상 사용 하는 것이 좋습니다 Make 또는 MakeAndInitialize 구성 요소를 직접 인스턴스화할 수 있습니다.

만들고 기본로 거 구성 요소를 인스턴스화할 수

  1. Visual Studio 작성 한 Win32 콘솔 응용 프로그램 프로젝트입니다.예를 들어, 프로젝트의 이름을 WRLLogger.

  2. 추가 된 Midl 파일 (.idl) : 파일 이름, 파일을 프로젝트에 ILogger.idl,이 코드를 추가:

    import "ocidl.idl";
    
    // Prints text to the console.
    [uuid(AFDB9683-F18A-4B85-90D1-B6158DAFA46C)]
    interface ILogger : IUnknown
    {
        HRESULT Log([in] BSTR text);
    }
    
  3. Wrllogger.cpp의 내용을 바꾸려면 다음 코드를 사용 합니다.

    #include "stdafx.h"
    #include <wrl\implements.h>
    #include <comutil.h>
    
    #include "ILogger_h.h"
    
    // comutil.h requires static linkage to comsuppw.lib.
    #pragma comment(lib, "comsuppw")
    
    using namespace Microsoft::WRL;
    
    // Writes logging messages to the console.
    class CConsoleWriter : public RuntimeClass<RuntimeClassFlags<ClassicCom>, ILogger>
    {
    public:
        STDMETHODIMP Log(_In_ BSTR text)
        {
            if (text == nullptr)
            {
                return E_POINTER;
            }
            wprintf_s(L"%s\n", text);
            return S_OK;
        }
    
    private:
        // Make destroyable only through Release.
        ~CConsoleWriter()
        {
        }
    };
    
    int _tmain()
    {
        ComPtr<CConsoleWriter> writer = Make<CConsoleWriter>();
        HRESULT hr = writer->Log(L"Logger ready.");
        return hr;
    }
    
    /* Output:
    Logger ready.
    */
    

기본로 거 구성 요소의 구문 오류를 처리 하려면

  1. 다음 코드를 사용 하 여 정의를 대체 하는 CConsoleWriter 클래스입니다.이 버전 전용 문자열 멤버 변수 및 재정의 보유 하 고 있는 RuntimeClass::RuntimeClassInitialize 메서드.RuntimeClassInitialize제공 된 매개 변수가 nullptr.

    // Writes logging messages to the console.
    class CConsoleWriter : public RuntimeClass<RuntimeClassFlags<ClassicCom>, ILogger>
    {
    public:
        // Initializes the CConsoleWriter object.
        // Failure here causes your object to fail construction with the HRESULT you choose.
        HRESULT RuntimeClassInitialize(_In_ BSTR category)
        {
            if (category == nullptr)
            {
                return E_POINTER;
            }
            m_category = category;
            return S_OK;
        }
    
        STDMETHODIMP Log(_In_ BSTR text)
        {
            if (text == nullptr)
            {
                return E_POINTER;
            }
            wprintf_s(L"%s: %s\n", m_category.GetBSTR(), text);
            return S_OK;
        }
    
    private:
        _bstr_t m_category;
    
        // Make destroyable only through Release.
        ~CConsoleWriter()
        {
        }
    };
    
  2. 다음 코드를 사용 하 여 정의를 바꾸려면 _tmain.이 버전을 사용 하 여 MakeAndInitialize 두 인스턴스화할 수 CConsoleWriter 개체입니다.데모에 대 한 첫 번째 호출이 성공 하 고 두 번째 호출은 실패 합니다.

    int _tmain()
    {
        BSTR category = L"INFO";
        ComPtr<CConsoleWriter> writer;
        HRESULT hr = MakeAndInitialize<CConsoleWriter>(&writer, category);
        if (FAILED(hr))
        {
            wprintf_s(L"Object creation failed. Result = 0x%x", hr);
            return hr;
        }
        hr = writer->Log(L"Logger ready.");
        if (FAILED(hr))
        {
            return hr;
        }
    
        wprintf_s(L"\n");
    
        category = nullptr;
        hr = MakeAndInitialize<CConsoleWriter>(&writer, category);
        if (FAILED(hr))
        {
            wprintf_s(L"Object creation failed. Result = 0x%x.\n", hr);
            return hr;
        }
        else
        {
            return writer->Log(L"Logger ready.");
        }
    }
    
    /* Output:
    INFO: Logger ready.
    
    Object creation failed. Result = 0x80004003.
    */
    

참고 항목

참조

Microsoft::WRL::Make

Microsoft::WRL::Details::MakeAndInitialize

개념

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