Chi sono ...
▪ Professionalmente ho cominciato nel lontano 1987
▪ Nel 2003 ho ricevuto il mio primo Award MVP (a Ottobre ho ricevuto il mio 14-esimo)
▪ La prossima settimana sarò al MVP Summit a Redmond
▪ Sono un Senior Software Architect
▪ Lavoro sia come consulente e gestisco la software division di Vevy Europe
▪ Lavoro in molti progetti divertenti e speciali:
▪ Financial, Racing, Manufacturing, ...
▪ Sono speaker e docente in corsi sulla programmazione da quasi 15 anni
▪ Sia in Italia che all’estero
Il problema del contratto binario
▪ C++ non ha mai definito un contratto binario
▪ Nel linguaggio C esistono convenzioni come stdcall, cdecl, fastcall
▪ La necessità di metadati
▪ Tanto tempo fa nacque IDL usato da Corba e COM
▪ Più tardi la versione successiva di COM, conosciuta come .NET definisce ECMA-335
▪ Nel 2011 escono le "Modern Apps" aka Windows Runtime Apps
1. Evoluzione del mondo COM (con regole più semplici)
2. Type system nuovo
3. Ri-uso dei metadati ECMA-335
Windows Runtime ArchitectureMetro apps Desktop apps
Windows Runtime APIs e Servizi
Win32
Language Projections
.NET / Js / C++
XAML DirectX HTML HTMLWPF SLWinform
MFC
DX
.NET / Js / C++
Windows Kernel Services
Win32XAML Pickers …Network
UI Controls MediaStorage
Windows Metadata
Windows Runtime Core
Runtime Broker
Accesso parzialea WinRT
BCL / libraries
La Abstract Binary Interface (ABI) del Windows Runtime
▪ Definita secondo le vecchie regole COM
▪ Le implementazioni o "Classi" sono solo esposte come interfacce
▪ Sono esposte come "ClassId" ("full qualified name" al posto dei vecchi guid)
▪ Espongono almeno 2 interfacce, identificate come IID (guid)
▪ Le interfacce esposte da tutte le classi sono:
▪ IUnknown: QueryInterface, AddRef e Release
▪ IInspectable: GetIIds, GetRuntimeClassName e GetTrustLevel
▪ Permettono di scoprire dinamicamente cosa espone la Classe (metadati!)
▪ Per chi la ricorda, è una evoluzione della vecchia IDispatch
WRLWindows Runtime Template Library
▪ È la libreria più di basso livello
▪ È una evoluzione della vecchia ATL (Active Template Library) di COM
▪ Molto più leggera e "semplice"
▪ Fornisce alcune classi di base come HString
▪ Wrapper di HSTRING e relative API
▪ Si, WinRT è la n-esima implementazione delle stringhe in C++ :)
▪ ComPtr è lo smart pointer che gestisce il ciclo di vita degli oggetti
▪ Vediamo il codice!
Le Projection
▪ Le projection sono un artefatto che semplificano l'accesso alle Classi
▪ Esempi:▪ Esporre una sintassi che accede a classi (ma in realtà avviene per interfacce)
▪ Far corrispondere alla costruzione della classe una attivazione tramite API di Windows
▪ Vantaggi:
▪ Sintassi semplificata
▪ Gestione (quasi) automatica del ciclo di vita degli oggetti tramite AddRef / Release
▪ Microsoft ha già creato diverse projection
▪ C++/CX è uno "slang" di C++ che genera i wrapper che realizzano la projection
▪ Il Framework.NET fruisce di una projection per tutti i linguaggi managed▪ CCW e RCW "trasformano" il ciclo di vita del GC in AddRef e Release
Modern Cppcppwinrt
▪ È un progetto creato da Kenny Kerr, ex-MVP canadese
▪ Oggi lavora nella divisione Windows e il progetto è diventato di Microsoft
▪ Tutto il sorgente (esempi a parte) è stato prodotto da un generatore
▪ Le pull-request sul progetto non sono possibili per questo motivo
▪ Il generatore processa i file WinMD (in formato ECMA-335) e gli 'include'
▪ Il formato ECMA-335 è ispezionabile tramite Reflector / ILSpy / …
▪ È sufficiente referenziare le include
▪ Non ci sono "Lib"
https://github.com/microsoft/cppwinrt
#include "winrt\base.h"#include "winrt\Windows.Foundation.h"#include "winrt\Windows.Web.Syndication.h"
Configurazioni del progetto Win32 (non UWP)
Necessario per le API Win32 del Windows Runtime
Folder con cppwinrt
Config per VC++2015
Mixare C++/CX e C++WinRT
▪ Due motivi per volerlo vare
▪ Aggiungere codice ad una codebase esistente
▪ Usare il markup XAML (in futuro Modern supporterà direttamente XAML)
▪ Setup come da template ma con solo
▪ Nel file pch.h aggiungere questa #define
▪ Evitare le ambiguità nell'importazione dei namespace. Es:
/bigobj /await /std:c++latest
#define _HAS_AUTO_PTR_ETC 1#include <collection.h>
namespace cx{
using namespace Windows::Foundation;using namespace Windows::Networking;
}
namespace winrt{
using namespace Windows::Foundation;using namespace Windows::Networking;
}
Codice!
Domande?
Grazie!