WinRT, C++/CX , WRL

먼저 WinRT에 대해서 얘기해보자.
Windows 8시절부터 Store App을 개발하던 프로그래머가 아니라면 좀 생소할 수도 있는데 Windows Runtime의 약자이고 Store App을 위한 새로운 Windows API이다.
공식적으로 소비자 대상으론 WinRT란 표현은 거의 쓰지 않는다. 하지만 API이름이 Windows Runtime이고 실제 개발을 하다보면 WinRT란 이름이 엄청나게 많이 나온다.
Windows 8.x가 망한 탓에 Windows 10에선 WinRT란 표현을 쓰고 싶어하지 않는것 같지만 UWP라고 아무리 포장을 해도 내부는 개선된 WinRT이다.

WinRT에 대해선 위키에 아주 깔끔하게 설명이 잘 되어있다.
https://en.wikipedia.org/wiki/Windows_Runtime

현재 Windows Store App은 대체로 C#으로 개발하는것 같지만 Windows 8초기엔 C++로 개발하는 사례가 많았고 여전히 오피스등 굵직한 앱들을 C++로 개발한다.

위키 설명에 보면 C++로 개발하는 경우 C++/CX와 WRL을 사용할 수 있다고 적혀 있다.
나도 그간 C++/CX로는 개발을 해왔는데 WRL은 처음 알았다. 아 물론 Windows 8때부터 지원되던 것인데 몰랐다. 그만치 잘 알려지지 않았다.쓰는 사람을 본적도 없다.
데스크탑 어플리케이션에서 WinRT를 사용하기 위해서 WRL을 사용할 수 있는데 C++/CX로도 데스크탑에서 WinRT사용이 가능하기 때문에 WRL같은건 찾아보지도 않았다.
WRL에 대해선 MSDN에 상세하게 설명이 되어있다.
https://msdn.microsoft.com/ko-kr/library/hh438466.aspx

그리고 좀 다른 얘기.

최근 C++/WinRT의 존재를 알게 됐다.
https://moderncpp.com/

나온지 오래 됐는데 내가 최근에 안게 아니고 실제로 따끈따근한 신기술이다. cppcon 2016에서의 발표 영상도 있다.
CppCon Videos

이게 뭣이냐면… C++/CX같은 비표준 C++을 사용하는 대신 표준 C++만으로 WinRT API를 사용하자는 프로젝트이다.
코드를 받아서 살펴보면, 사실 내용이 너무 적다. 헤더파일로만 이루어져있는데 코드도 대단한것이 없고 그냥 WinRT API를 C++메소드로 한겹 감싼 정도이다. 보면 표준 C++로 호출할 수 있도록 OS에서 인터페이스를 제공한다는 느낌을 받는다. 아니 그렇게 안하고는 표준 C++만으로는 WinRT API를 호출할 방법이 없다.
디스어셈블창에서 조금 따라가보면 OS에서 실제로 그런 인터페이스를 제공하는 것을 쉽게 알 수 있다. 예를 들어 base.h의 WINRT_RoInitialize함수를 디스어셈블창에서 따라가보면 RoInitialize()를 호출함을 알 수 있다.
RoInitialize()는 데스크탑 C++프로젝트에서 WRL을 사용해서 WinRT API를 호출하기 전에 스레드모델을 초기화하기 위해 사용한다.

즉 C++/WinRT는 WRL 기반이다.

그리고 최근 MS mvp summit 2016에 참석하러 시애틀에 갔다가 Surface Dial을 구입했다.
시애틀의 게스트 하우스에서 Surface Dial을 가지고 이것저것 해보려고 샘플코드를 살펴봤다.
데스크탑과 UWP양쪽을 지원하는데 코드를 살펴보면 가져다 쓰는 API는 사실상 같다. 호출하는 방법이 다르다.

데스크탑 코드를 보면 이런 코드가 있다.
HRESULT hr = Windows::Foundation::Initialize(RO_INIT_MULTITHREADED);
따라가보면 RoInitialize()다.
얘도 WRL을 사용한다.

UWP쪽 샘플을 보면 여전히 C++/CX를 사용한다.

정리해보면 다음과 같다.

 

  1. C++로 WinRT API를 사용할 수 있는 통로는 C++/CX와 WRL 두가지가 있다.
  2. WRL은 데스크탑 어플리케이션에서 WinRT API를 호출하거나 MS내부에서 사용할 목적으로 만들었던 것으로 보인다.
  3. MS에선 WRL로의 개발을 장려하고 싶지 않았다. C++로 개발하는 경우 C++/CX를 권장했다.
  4. Windows 8.x가 실패하고 새로운 국면에 접어들었다. 사람들은 여전히 데스크탑 어플리케이션을 원했고 데스크탑 어플리케이션은 Windows에 있어 여전히 중요한 영역이었다.
  5. 새로운 펜.잉크 API, Surface Dial과 같은 디바이스들을 데스크탑에서 사용해야할 필요가 있었고 WRL에 대해서 다시 신경을 쓰게 된것으로 보인다.
  6. 최근 C++/WinRT를 보면 사실상 UWP에서 C++/CX대신 WRL을 사용하게 된다. 만약 MS가 C++/WinRT를 지속적으로 밀게 된다면 사실살 WRL이 C++/CX를 밀어내고 UWP앱 개발도구의 메이저가 된다.

 
최근 C++/CX로 OneDrive에 접속하는 샘플코드를 작성해서 github에 올렸다. 그리고 이걸 reddit에 공유했는데 질문이 하나 달렸다.
왜 C++/WinRT를 사용하지 않고 C++/CX를 사용했냐는 것이다.
그 코드를 작성할 시점에서 난 C++/WinRT의 존재를 몰랐다. 그리고 C++/WinRT를 사용할 경우 Visual Studio의 XAML Designer와 상호작용이 불가능하다. 모든 컨트롤들을 코드로 작성해서 수동 배치하고 바인딩해야되는데 지금도 그건 무리라고 생각한다.
MS가 C++/WinRT를 계속 밀려면 Visual Studio의 XAML Designer와 상호작용이 가능해야할텐데 이 부분을 어떻게 처리할지 상당히 궁금해진다.

개인적으로는 빌어먹을 exception으로 떡칠하는 C++/CX를 앞으로 사용 안해도 될 날이 올지 꽤 기대된다.


답글 남기기

댓글을 게시하려면 다음의 방법 중 하나를 사용하여 로그인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중