연습: WRL을 사용하여 기본 Windows 런타임 구성 요소 만들기
이 문서를 사용 하는 방법을 보여 줍니다 있는 Windows 런타임 C++ 템플릿 라이브러리 (WRL) 기본 만들려면 Windows 런타임 구성 요소.두 숫자를 추가 컴포넌트와 프라임 발생 했을 때 이벤트를 발생 시킵니다.이 문서에는 또한 구성 요소를 사용 하는 방법을 보여 줍니다 있는 Windows 스토어 Javascript를 사용 하 여 응용 프로그램.
사전 요구 사항
경험으로 Windows 런타임.
COM과 경험
기본을 만들려면 Windows 런타임 두 숫자를 추가 하는 구성 요소
Visual Studio는 Visual C++ 만드는 WRLClassLibrary 프로젝트입니다.문서 WRL 클래스 라이브러리 프로젝트 템플릿 서식이 파일을 다운로드 하는 방법에 설명 합니다.프로젝트의 이름을 Contoso.
Contoso.cpp 및 Contoso.idl에서 "계산기"와 "WinRTClass"의 모든 인스턴스를 대체 합니다.
Contoso.idl에 추가 된 Add 메서드에 ICalculator 인터페이스.
HRESULT Add([in] int a, [in] int b, [out, retval] int* value);
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를 사용 하는 응용 프로그램
Visual Studio 새 JavaScript 추가 빈 응용 프로그램 프로젝트의 Contoso 솔루션입니다.프로젝트의 이름을 CalculatorJS.
에 CalculatorJS 프로젝트에 대 한 참조를 추가 Contoso 프로젝트입니다.
Default.html의 교체는 body 이러한 UI 요소 섹션:
<div> <input id="a" /> <input id="b" /> <p id="result">Result:</p> <button onclick="Add()">Add</button> </div>
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에서 메서드 이름의 첫 글자를 소문자로 표준 명명 규칙에 맞게 변경 됩니다.
소수 계산 될 때 발생 하는 이벤트를 추가 하려면
선언 하기 전에 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; };
에 ICalculator 인터페이스를 정의 PrimeNumberFound 이벤트입니다.eventadd 및 eventremove 특성을 지정 하는 소비자는 ICalculator 인터페이스 있습니다 모두 구독 하 고이 이벤트를 구독 취소 합니다.
[eventadd] HRESULT PrimeNumberFound( [in] PrimeNumberEvent* eventHandler, [out, retval] EventRegistrationToken* eventCookie); [eventremove] HRESULT PrimeNumberFound( [in] EventRegistrationToken eventCookie);
Contoso.cpp에 추가 된 privateMicrosoft::WRL::EventSource 이벤트 등록자를 관리 하 고 이벤트 처리기를 호출 하는 멤버 변수.
EventSource<IPrimeNumberEvent> m_events;
Contoso.cpp에 구현 된 add_PrimeNumberFound 및 remove_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); }
소수 계산 될 때 이벤트를 발생 시키려면
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; }
수정 된 Calculator의 Add 메서드를 호출 하는 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에서 이벤트를 처리 하려면
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>
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"의 표준 명명 규칙에 맞게 추가 됩니다.
다음 그림에서는 기본 계산기 응용 프로그램을 보여 줍니다.