다음을 통해 공유


연습: WRL을 사용하여 기본 Windows 런타임 구성 요소 만들기

이 문서를 사용 하는 방법을 보여 줍니다 있는 Windows 런타임 C++ 템플릿 라이브러리 (WRL) 기본 만들려면 Windows 런타임 구성 요소.두 숫자를 추가 컴포넌트와 프라임 발생 했을 때 이벤트를 발생 시킵니다.이 문서에는 또한 구성 요소를 사용 하는 방법을 보여 줍니다 있는 Windows 스토어 Javascript를 사용 하 여 응용 프로그램.

사전 요구 사항

기본을 만들려면 Windows 런타임 두 숫자를 추가 하는 구성 요소

  1. Visual Studio는 Visual C++ 만드는 WRLClassLibrary 프로젝트입니다.문서 WRL 클래스 라이브러리 프로젝트 템플릿 서식이 파일을 다운로드 하는 방법에 설명 합니다.프로젝트의 이름을 Contoso.

  2. Contoso.cpp 및 Contoso.idl에서 "계산기"와 "WinRTClass"의 모든 인스턴스를 대체 합니다.

  3. Contoso.idl에 추가 된 Add 메서드에 ICalculator 인터페이스.

    HRESULT Add([in] int a, [in] int b, [out, retval] int* value);
    
  4. Contoso.cpp에 추가 Add 메서드에 public 섹션의 Calculator 클래스.

    HRESULT __stdcall Add(_In_ int a, _In_ int b, _Out_ int* value)
    {
        if (value == nullptr)
        {
            return E_POINTER;
        }
        *value = a + b;
        return S_OK;
    }
    
    중요중요

    사용 하는 COM 구성 요소를 만드는 때문에 기억은 __stdcall 호출 규칙입니다.

    사용 하는 것이 좋습니다 _Out_ 및 기타 소스 주석 (SAL) 언어 주석 함수 매개 변수를 사용 하는 방법에 대해 설명 합니다.또한 SAL 주석을 반환 값을 설명합니다.SAL 주석이 작업은 C/c + + 코드 분석 도구 발생할 수 있는 결함을 C 및 c + + 소스 코드를 검색 합니다.버퍼 오버런, 초기화 되지 않은 메모리 도구를 통해 보고 되는 일반적인 코딩 오류를 포함 하 고 null 포인터 역참조, 메모리 및 리소스 누수.

구성 요소에서 사용 하는 Windows 스토어 Javascript를 사용 하는 응용 프로그램

  1. Visual Studio 새 JavaScript 추가 빈 응용 프로그램 프로젝트의 Contoso 솔루션입니다.프로젝트의 이름을 CalculatorJS.

  2. 에 CalculatorJS 프로젝트에 대 한 참조를 추가 Contoso 프로젝트입니다.

  3. Default.html의 교체는 body 이러한 UI 요소 섹션:

    <div>
        <input id="a" />
        <input id="b" />
        <p id="result">Result:</p>
        <button onclick="Add()">Add</button>
    </div>
    
  4. Default.js에서 구현 된 OnClick 함수입니다.

    function Add() {
        "use strict";
    
        var calculator = new Contoso.Calculator();
    
        var a = document.getElementById("a");
        var b = document.getElementById("b");
    
        document.getElementById("result").innerHTML = "Result: " + calculator.add(a.value, b.value);
    }
    

    [!참고]

    Javascript에서 메서드 이름의 첫 글자를 소문자로 표준 명명 규칙에 맞게 변경 됩니다.

소수 계산 될 때 발생 하는 이벤트를 추가 하려면

  1. 선언 하기 전에 Contoso.idl에서 ICalculator, 대리자 형식을 정의 PrimeNumberEvent에서 제공 하는 int 인수.

    [uuid(3FBED04F-EFA7-4D92-B04D-59BD8B1B055E), version(COMPONENT_VERSION)]
    delegate HRESULT PrimeNumberEvent(int primeNumber);
    

    사용 하는 경우는 delegate 키워드, MIDL 컴파일러 포함 된 인터페이스를 만들는 Invoke 해당 대리자 시그니처와 일치 하는 메서드.이 예제에서는 생성 된 파일은 Contoso_h.h 정의 IPrimeNumberEvent 인터페이스는이 절차의 뒷부분에서 사용 됩니다.

    MIDL_INTERFACE("3FBED04F-EFA7-4D92-B04D-59BD8B1B055E")
    IPrimeNumberEvent : public IUnknown
    {
    public:
        virtual HRESULT STDMETHODCALLTYPE Invoke( 
            int primeNumber) = 0;
    
    };
    
  2. ICalculator 인터페이스를 정의 PrimeNumberFound 이벤트입니다.eventaddeventremove 특성을 지정 하는 소비자는 ICalculator 인터페이스 있습니다 모두 구독 하 고이 이벤트를 구독 취소 합니다.

    [eventadd]
    HRESULT PrimeNumberFound(
        [in] PrimeNumberEvent* eventHandler, 
        [out, retval] EventRegistrationToken* eventCookie);
    [eventremove] 
    HRESULT PrimeNumberFound(
        [in] EventRegistrationToken eventCookie);
    
  3. Contoso.cpp에 추가 된 privateMicrosoft::WRL::EventSource 이벤트 등록자를 관리 하 고 이벤트 처리기를 호출 하는 멤버 변수.

    EventSource<IPrimeNumberEvent> m_events;
    
  4. Contoso.cpp에 구현 된 add_PrimeNumberFoundremove_PrimeNumberFound 메서드.

    HRESULT __stdcall add_PrimeNumberFound(_In_ IPrimeNumberEvent* event, _Out_ EventRegistrationToken* eventCookie)
    {
        return m_events.Add(event, eventCookie);
    }
    
    HRESULT __stdcall remove_PrimeNumberFound(_In_ EventRegistrationToken eventCookie)
    {
        return m_events.Remove(eventCookie);
    }
    

소수 계산 될 때 이벤트를 발생 시키려면

  1. Contoso.cpp에 추가 IsPrime 메서드에 private 섹션의 Calculator 클래스.

    // Determines whether the input value is prime.
    bool IsPrime(int n)
    {
        if (n < 2)
        {
            return false;
        }
        for (int i = 2; i < n; ++i)
        {
            if ((n % i) == 0)
            {
                return false;
            }
        }
        return true;
    }
    
  2. 수정 된 CalculatorAdd 메서드를 호출 하는 Microsoft::WRL::EventSource::InvokeAll 메서드는 소수 계산 되는 경우.

    HRESULT __stdcall Add(_In_ int a, _In_ int b, _Out_ int* value)
    {
        if (value == nullptr)
        {
            return E_POINTER;
        }
        int c = a + b;
        if (IsPrime(c))
        {
            m_events.InvokeAll(c);
        }
        *value = c;
        return S_OK;
    }
    

Javascript에서 이벤트를 처리 하려면

  1. Default.html에서 수정 된 body 소수 포함 하는 텍스트 영역을 포함 하는 섹션.

    <div>
        <input id="a" />
        <input id="b" />
        <p id="result">Result:</p>
        <p id="primes" style="color:#808080">Primes found:</p>
        <button onclick="Add()">Add</button>
    </div>
    
  2. Default.js 파일을 수정의 Add 함수를 처리 하는 PrimeNumberFound 이벤트입니다.이전 단계에서 정의 된 텍스트 영역에 프라임 번호 이벤트 처리기를 추가 합니다.

    function Add() {
        "use strict";
    
        var calculator = new Contoso.Calculator();
        calculator.onprimenumberfound = function (ev) {
            document.getElementById("primes").innerHTML += " " + ev.target;
        };
    
        var a = document.getElementById("a");
        var b = document.getElementById("b");
    
        document.getElementById("result").innerHTML = "Result: " + calculator.add(a.value, b.value);
    }
    

    [!참고]

    Javascript에서 이벤트 이름을 소문자 변경 되며 앞에 "on"의 표준 명명 규칙에 맞게 추가 됩니다.

다음 그림에서는 기본 계산기 응용 프로그램을 보여 줍니다.

JavaScript를 사용한 기본 계산기 응용 프로그램

참고 항목

개념

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

WRL 클래스 라이브러리 프로젝트 템플릿

C/c + + 코드 분석 도구