SlideShare una empresa de Scribd logo
1 de 12
Project Modern C++
AKA
« cppwinrt »
Raffaele Rialdi
@raffaeler
raffaeler@vevy.com http://iamraf.net
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 Architecture
Metro apps Desktop apps
Windows Runtime APIs e Servizi
Win32
Language Projections
.NET / Js / C++
XAML DirectX HTML HTMLWPF SL
Win
form
MFC
DX
.NET / Js / C++
Windows Kernel Services
Win32
XAML Pickers …Network
UI Controls MediaStorage
Windows
Metadata
Windows Runtime Core
Runtime Broker
Accesso parziale
a 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
WRL
Windows 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 Cpp
cppwinrt
▪ È 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 "winrtbase.h"
#include "winrtWindows.Foundation.h"
#include "winrtWindows.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!

Más contenido relacionado

Similar a Project modern c++ (ITA)

Introduzione a TypeScript
Introduzione a TypeScriptIntroduzione a TypeScript
Introduzione a TypeScriptSinergia Totale
 
2014.04.04 Sviluppare applicazioni web (completamente) on line con Visual Stu...
2014.04.04 Sviluppare applicazioni web (completamente) on line con Visual Stu...2014.04.04 Sviluppare applicazioni web (completamente) on line con Visual Stu...
2014.04.04 Sviluppare applicazioni web (completamente) on line con Visual Stu...Marco Parenzan
 
ASP.NET Core 2 e Docker
ASP.NET Core 2 e DockerASP.NET Core 2 e Docker
ASP.NET Core 2 e DockerLuca Congiu
 
Meetup ASP.NET Core 2 e Docker
Meetup ASP.NET Core 2 e Docker Meetup ASP.NET Core 2 e Docker
Meetup ASP.NET Core 2 e Docker dotnetcode
 
High Level Synthesis Using Esterel
High Level Synthesis Using EsterelHigh Level Synthesis Using Esterel
High Level Synthesis Using EsterelAlberto Minetti
 
.Net 4.0 Preview @ UGIdotNet
.Net 4.0 Preview @ UGIdotNet.Net 4.0 Preview @ UGIdotNet
.Net 4.0 Preview @ UGIdotNetMauro Servienti
 
CI CD per .Net 5? Facile con Azure Pipelines e GitHub Actions
 CI CD per .Net 5? Facile con Azure Pipelines e GitHub Actions  CI CD per .Net 5? Facile con Azure Pipelines e GitHub Actions
CI CD per .Net 5? Facile con Azure Pipelines e GitHub Actions Davide Benvegnù
 
Stato dell'arte del progetto CMDBuild - CMDBuild Day, 15 aprile 2010
Stato dell'arte del progetto CMDBuild - CMDBuild Day, 15 aprile 2010Stato dell'arte del progetto CMDBuild - CMDBuild Day, 15 aprile 2010
Stato dell'arte del progetto CMDBuild - CMDBuild Day, 15 aprile 2010CMDBuild org
 
Thanatos - Parallel & Distributed Computing
Thanatos -  Parallel & Distributed ComputingThanatos -  Parallel & Distributed Computing
Thanatos - Parallel & Distributed ComputingIdriss Riouak
 
Node.js - Server Side Javascript
Node.js - Server Side JavascriptNode.js - Server Side Javascript
Node.js - Server Side JavascriptMatteo Napolitano
 
Introduzione a Drupal 7 - 14/03/2013
Introduzione a Drupal 7 - 14/03/2013Introduzione a Drupal 7 - 14/03/2013
Introduzione a Drupal 7 - 14/03/2013Alessandro del Gobbo
 

Similar a Project modern c++ (ITA) (20)

Livecode
LivecodeLivecode
Livecode
 
Da DotNet a DotNetCore
Da DotNet a DotNetCoreDa DotNet a DotNetCore
Da DotNet a DotNetCore
 
Introduzione a TypeScript
Introduzione a TypeScriptIntroduzione a TypeScript
Introduzione a TypeScript
 
VS Package @ CD2008
VS Package @ CD2008VS Package @ CD2008
VS Package @ CD2008
 
2014.04.04 Sviluppare applicazioni web (completamente) on line con Visual Stu...
2014.04.04 Sviluppare applicazioni web (completamente) on line con Visual Stu...2014.04.04 Sviluppare applicazioni web (completamente) on line con Visual Stu...
2014.04.04 Sviluppare applicazioni web (completamente) on line con Visual Stu...
 
C++.pptx
C++.pptxC++.pptx
C++.pptx
 
ASP.NET Core 2 e Docker
ASP.NET Core 2 e DockerASP.NET Core 2 e Docker
ASP.NET Core 2 e Docker
 
Meetup ASP.NET Core 2 e Docker
Meetup ASP.NET Core 2 e Docker Meetup ASP.NET Core 2 e Docker
Meetup ASP.NET Core 2 e Docker
 
Applicazioni open source
Applicazioni open sourceApplicazioni open source
Applicazioni open source
 
High Level Synthesis Using Esterel
High Level Synthesis Using EsterelHigh Level Synthesis Using Esterel
High Level Synthesis Using Esterel
 
Reportage Delphi Day 2012
Reportage Delphi Day 2012Reportage Delphi Day 2012
Reportage Delphi Day 2012
 
.Net 4.0 Preview @ UGIdotNet
.Net 4.0 Preview @ UGIdotNet.Net 4.0 Preview @ UGIdotNet
.Net 4.0 Preview @ UGIdotNet
 
CI CD per .Net 5? Facile con Azure Pipelines e GitHub Actions
 CI CD per .Net 5? Facile con Azure Pipelines e GitHub Actions  CI CD per .Net 5? Facile con Azure Pipelines e GitHub Actions
CI CD per .Net 5? Facile con Azure Pipelines e GitHub Actions
 
Stato dell'arte del progetto CMDBuild - CMDBuild Day, 15 aprile 2010
Stato dell'arte del progetto CMDBuild - CMDBuild Day, 15 aprile 2010Stato dell'arte del progetto CMDBuild - CMDBuild Day, 15 aprile 2010
Stato dell'arte del progetto CMDBuild - CMDBuild Day, 15 aprile 2010
 
GNU Linux Programming introduction
GNU Linux Programming introductionGNU Linux Programming introduction
GNU Linux Programming introduction
 
Dot net framework 2
Dot net framework 2Dot net framework 2
Dot net framework 2
 
Thanatos - Parallel & Distributed Computing
Thanatos -  Parallel & Distributed ComputingThanatos -  Parallel & Distributed Computing
Thanatos - Parallel & Distributed Computing
 
Thanatos
ThanatosThanatos
Thanatos
 
Node.js - Server Side Javascript
Node.js - Server Side JavascriptNode.js - Server Side Javascript
Node.js - Server Side Javascript
 
Introduzione a Drupal 7 - 14/03/2013
Introduzione a Drupal 7 - 14/03/2013Introduzione a Drupal 7 - 14/03/2013
Introduzione a Drupal 7 - 14/03/2013
 

Project modern c++ (ITA)

  • 1. Project Modern C++ AKA « cppwinrt » Raffaele Rialdi @raffaeler raffaeler@vevy.com http://iamraf.net
  • 2. 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
  • 3. 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
  • 4. Windows Runtime Architecture Metro apps Desktop apps Windows Runtime APIs e Servizi Win32 Language Projections .NET / Js / C++ XAML DirectX HTML HTMLWPF SL Win form MFC DX .NET / Js / C++ Windows Kernel Services Win32 XAML Pickers …Network UI Controls MediaStorage Windows Metadata Windows Runtime Core Runtime Broker Accesso parziale a WinRT BCL / libraries
  • 5. 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
  • 6. WRL Windows 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!
  • 7. 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
  • 8. Modern Cpp cppwinrt ▪ È 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 "winrtbase.h" #include "winrtWindows.Foundation.h" #include "winrtWindows.Web.Syndication.h"
  • 9. Configurazioni del progetto Win32 (non UWP) Necessario per le API Win32 del Windows Runtime Folder con cppwinrt Config per VC++2015
  • 10. 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; }