WinRT, WRL oraz ABI, jak to się ma do siebie w kontekście Windows 8

No właśnie. Jeśli ktokolwiek z was nie miał jeszcze okazji przyjrzeć się Windows 8 to pewnie są to tylko jakieś skróty. Może z wyjątkiem ABI, który jest terminem w miarę ukształtowanym, chociaż pewnie w bieżących czasach aż tak często nie czujemy potrzeby zgłębiać się w jego definicję.

Zacznę więc może od końca.

ABI = Application Binary Interface. Po dłuższe wytłumaczenie odsyłam do Wikipedii oraz StackOverflow. W skrócie jest to abstrakcyjny interfejs dla aplikacji, za pomocą z którego komunikują się z systemem operacyjnym czy innymi aplikacjami. Opis takiego interfejsu może zawiera format danych przekazywanych danych czy parametrów, sposób wywoływania funkcji (metod), sposób w jaki aplikacja wywołuje funkcje systemowe.

Przykład ABI to prosta funkcja, która może wyglądać tak:

int function foo(int bar)
{
   return bar;
}

W ramach ABI, możemy ustalić, czy:
- parametr wejściowy jest przekazywany poprzez zarezerwowane rejestry procesora (tak często bywało przy kompilatorach i 16bitowych systemach operacyjnych).
- parametr wejściowy jest przekazywany poprzez stos i w ciele funkcji zdejmowany ze stosu (__cdecl)
- czy gdybyśmy mieli więcej parametrów to wrzucane były by na stos od lewej do prawej czy od prawej do lewej (konwencja C lub Pascalowska)
- w jaki sposób przekazywane są wyjątki
- w jaki sposób jedna platforma jest w stanie odczytać obiekt, w jaki sposób możemy go przekazać (pochodne z serializacją, marshalling)

ABI może być różne dla architektury procesora, systemu operacyjnego, kompilatora, platformy deweloperskiej w zależności od funkcji celu jaką realizuje.

WRL to skrót od Windows Runtime Library, czyli biblioteka C++ dla biblioteki systemowej Windows 8 o dźwięcznej nazwie WinRT (Windows Runtime).
WinRT same w sobie da się programować w C++, więc po co WRL?

Otóż ze względu właśnie na ABI Windows 8 i mechanizmy zaszyte w WinRT (jak możliwość projekcji bibliotek w niej zawartych na różne języki programowania, specyfika bezpieczeństwa, zarządzania pamięcią, itd) programowanie w C++ to tak naprawdę programowanie w C++/Cx. Cx to nakładka na standardowy ISO C++ zawierająca wiele ciekawych mechanizmów zawartych w składni. Mamy obiekty z daszkiem (Object^), dla których pamięć jest zarządzana poprzez liczenie referencji (refcount). Klasy mogą być zamknięte dla dalszego dziedziczenia (sealed). Klasy mogą mieć właściwości (properties) i akcesory (get/set), to tylko przykłady dodatkowych elementów języka pomocnych w tym, aby jedna spójna biblioteka była dostępna dla wszystkich języków programowania wspieranych systemowo (C++, C#, VB, Javascript).

Z perspektywy programisty C++ widoczne są dwie opcje, albo zaakceptuje te zmiany w języku i efektywnie korzystając z biblioteki WinRT może napisać aplikację Windows 8, albo...

... przyjrzy się skrótowi WRL, który to jest biblioteką COM wykorzystująca tylko ISO C++, nie ma daszków i innych rzeczy, których purysta C++ nie chce zaakceptować.
Składnia jest trochę pokręcona (na pewno więcej linii kodu), ale właśnie wynika to z ABI.. 

Dlaczego COM? Otóż całe Windows RT zostało napisane w znacząco zmienionej wersji, ale wciąż COMa.

De facto wielu programistów C++, którzy korzystają tylko z WRL już zaczęło w żargonie mówić, że programują w ABI, kiedy to wykorzystują czyste C++ i bibliotekę WRL.

WRL jest wciąż słabo udokumentowane na stronach MSDN, więc jeśli jesteście zainteresowani konkretniejszą dawką wiedzy, polecam prezentacje z konferencji Microsoft (Build i Developing Windows 8 Metro styled apps with C++ ):

https://channel9.msdn.com/Events/Windows-Camp/Developing-Windows-8-Metro-style-apps-in-Cpp/The-Windows-Runtime-Library-WRL
https://view.officeapps.live.com/op/view.aspx?src=http%3a%2f%2fecn.channel9.msdn.com%2fevents%2fWin8CppEvent%2fWRL.pptx

https://channel9.msdn.com/Events/BUILD/BUILD2011/TOOL-532T#c634517976543836549