Project modern c++ (ITA)

12
Project Modern C++ AKA « cppwinrt » Raffaele Rialdi @raffaeler [email protected] http://iamraf.net

Transcript of Project modern c++ (ITA)

Page 1: Project modern c++ (ITA)

Project Modern C++AKA

« cppwinrt »

Raffaele Rialdi@[email protected] http://iamraf.net

Page 2: Project modern c++ (ITA)

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

Page 3: Project modern c++ (ITA)

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

Page 4: Project modern c++ (ITA)

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

Page 5: Project modern c++ (ITA)

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

Page 6: Project modern c++ (ITA)

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!

Page 7: Project modern c++ (ITA)

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

Page 8: Project modern c++ (ITA)

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"

Page 9: Project modern c++ (ITA)

Configurazioni del progetto Win32 (non UWP)

Necessario per le API Win32 del Windows Runtime

Folder con cppwinrt

Config per VC++2015

Page 10: Project modern c++ (ITA)

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;

}

Page 11: Project modern c++ (ITA)

Codice!

Page 12: Project modern c++ (ITA)

Domande?

Grazie!