C++/WinRT란
C++/WinRT는 윈도우 런타임 (Windows Runtime) APIs를 이용하는 새로운 윈도우 애플리케이션 개발 방법입니다. 과거 C++/CLI, C++/CX와 같이 API를 랩핑한 코드들이 있었지만, 문법이 난해했고, 성능도 떨어졌습니다. 그에 비해 C++/WinRT는 C++ 17 표준과 완벽히 호환되며, 성능도 기존의 C#이나 C++/CX보다 훨씬 개선되었습니다. 표준 C++ 키워드, 표준 데이터 타입 및 알고리즘까지 호환되며 Win32부터 UWP까지 C++/WinRT를 사용하여 코드를 현대적이며 깔끔하게 표준을 유지할 수 있습니다.
사용하기에 앞서
C++/WinRT를 사용하려면 먼저 최신 Windows SDK와 Visual Studio가 필요합니다. 마이크로소프트에서는 Windows SDK 10.0.17134.0 버전(Windows10 버전 1803) 이상과 Visual Studio 2019 또는 Visual Studio 2017(최소 15.7 버전 이상)을 권장하고 있습니다.
Visual Studio Installer를 실행한 다음 설치되어있는 비주얼 스튜디오의 수정을 눌러 유니버셜 Windows 플랫폼 개발의 C++(v142) 유니버셜 Windows 플랫폼 도구를 활성화시켜줍니다.
그 후 비주얼 스튜디오를 실행해 확장 관리에 들어간 후 C++/WinRT를 검색해 다운로드 받은 후 비주얼 스튜디오를 재시작해줍니다.
프로젝트 생성
모두 완료했으면 이제 프로젝트를 생성해 봅니다. 마이크로소프트의 예제(링크)를 따라하겠습니다. 새 프로젝트를 눌러 C++/WinRT라 적혀있는 Windowss Console Application을 클릭해서 생성합니다.
처음 생성한 프로젝트에는 pch.h와 pch.cpp, main.cpp파일만 존재합니다. pch.h에는 WinRT에 대한 헤더 파일이, pch.cpp에는 아무 내용도 없고, main.cpp에는 pch.h를 포함합니다. pch.h는 미리 컴파일된 헤더로 프로젝트를 생성할 때 자동으로 지정해 줍니다. 아래는 winrt와 Windows::Foundation을 네임스페이스로 설정했고요. main 함수에서는 먼저 init_apartment();라는 문장을 썼는데 이는 winrt::init_apartment로 이를 호출하면 기본적으로 다중 스레드 아파트에서 Windows 런타임의 스레드와 COM을 초기화한다고 합니다. 다음에는 rssFeedUri라는 이름의 Uri 객체를 생성하는데 매개변수로 L"blogs.windows.com/feed"을 줬네요. L""은 와이드 문자열 리터럴로 자세한 내용은 문자 리터럴 문서(링크)를 확인해 주세요. 결국 "blogs.windows.com/feed"라는문자열을 입력하였습니다. 이것을 printf 구문으로 AbsoluteUri라는 메서드를 사용한 값을 c_str 메서드로 winrt::hstring 형태로 변환한 후 포인터를 넘겨줬습니다. 위의 Uri 객체는 winrt::Windows::Foundation의 Uri 객체입니다. 따라서 아무 것도 건드리지 않고 실행했을 경우 콘솔창에 Hello, aka.ms/cppwinrt! 라는 값이 출력되게 됩니다.
이제 마이크로소프트의 예제 내용대로 수정해보겠습니다. 먼저 pch.h에는 winrt/Windows.Web.Syndication.h 라는 새로운 인클루드가 추가되었습니다. 그 다음 main.cpp에는 Syndication을 네임스페이스에 등록하고 main()에서 사용하네요. SyndicationClient은 URI에서 비동기적으로 피드를 검색하는 인터페이스입니다. (링크) SyndicationClient 객체를 생성하고 곧바로 SyndicationFeed 라는객체를 생성하는데 SyndicationClient에서 RetrieveFeedAsync 메서드를 사용하여 넘겨줍니다. RetrieveFeedAsync는 SyndicationClient::RetrieveFeedAsync메서드로 URI로부터 신디케이션 피드를 다운로드 받는 비동기 winrt 함수입니다. (링크) RetrieveFeedAsync에서 개체를 받은 후, 해당 개체에서 get()을 호출하여 호출 스레드를 차단하고 결과를 기다리게 됩니다.
그 다음으로는 Loop문이 있습니다. syndicationFeed 객체로부터 Items를 받아와 loop를 돌리게 됩니다. 이렇게 winrt의 컬렉션을 반복하려면 winrt/Windows.Foundation.Collections.h가 필요합니다. 반복문 안에는 foreach문을 통해 매번 생성되는 syndicationItem에서 Title의 Text를 winrt::hstring 타입으로 받아옵니다. 이렇게 받아온 hstring을 c_str() 함수로 string 형태로 변환하여 포인터를 반환하여 출력하는게 이 코드입니다.
네. 잘 실행이 됐네요. 위에서 작성한 Uri blogs.windows.com/feed/에 있는 Title들이 잘 출력되는 것을 확인할 수 있습니다.
참고
docs.microsoft.com/ko-kr/windows/uwp/cpp-and-winrt-apis/
C++/WinRT - UWP applications
C++/WinRT는 헤더 파일 기반 라이브러리로 구현된 WinRT(Windows 런타임) API용 완전한 표준 C++17 언어 프로젝션입니다.
docs.microsoft.com
docs.microsoft.com/ko-kr/windows/uwp/cpp-and-winrt-apis/get-started
C++/WinRT 시작 - UWP applications
C++/WinRT 사용 속도를 높이려면 이 항목에서 안내하는 단순한 코드 예제를 살펴봅니다.
docs.microsoft.com
blogs.windows.com/windowsdeveloper/2016/11/28/standard-c-windows-runtime-cwinrt/
Standard C++ and the Windows Runtime (C++/WinRT)
The Windows Runtime (WinRT) is the technology that powers the Universal Windows Platform, letting developers write applications that are common to all Windows devices, from Xbox to PCs to HoloLens to phones. Most of UWP can also be used by developers tar
blogs.windows.com
'스터디 > C++ WinRT' 카테고리의 다른 글
4일차. C++/WinRT 프로젝트에 WinUI 적용하기 (0) | 2020.12.05 |
---|---|
3일차. WinUI 앱 디자인 기초 (0) | 2020.12.05 |
2일차. UWP "Hello, World!" 앱 만들기 (3/3) (0) | 2020.12.01 |
2일차. UWP "Hello, World!" 앱 만들기 (2/3) (0) | 2020.12.01 |
2일차. UWP "Hello, World!" 앱 만들기 (1/3) (0) | 2020.12.01 |
최근댓글