Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
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 h...
Il problema del contratto binario
▪ C++ non ha mai definito un contratto binario
▪ Nel linguaggio C esistono convenzioni c...
Windows Runtime Architecture
Metro apps Desktop apps
Windows Runtime APIs e Servizi
Win32
Language Projections
.NET / Js /...
La Abstract Binary Interface (ABI) del Windows Runtime
▪ Definita secondo le vecchie regole COM
▪ Le implementazioni o "Cl...
WRL
Windows Runtime Template Library
▪ È la libreria più di basso livello
▪ È una evoluzione della vecchia ATL (Active Tem...
Le Projection
▪ Le projection sono un artefatto che semplificano l'accesso alle Classi
▪ Esempi:
▪ Esporre una sintassi ch...
Modern Cpp
cppwinrt
▪ È un progetto creato da Kenny Kerr, ex-MVP canadese
▪ Oggi lavora nella divisione Windows e il proge...
Configurazioni del progetto Win32 (non UWP)
Necessario per le API Win32 del Windows Runtime
Folder con cppwinrt
Config per...
Mixare C++/CX e C++WinRT
▪ Due motivi per volerlo vare
▪ Aggiungere codice ad una codebase esistente
▪ Usare il markup XAM...
Codice!
Domande?
Grazie!
Upcoming SlideShare
Loading in …5
×

Project modern c++ (ITA)

401 views

Published on

Presenting Modern C++ AKA cppwinrt
Demos:
https://github.com/raffaeler/cppwinrt_demo1
https://github.com/raffaeler/cppwinrt_demo2

Published in: Software
  • Be the first to comment

  • Be the first to like this

Project modern c++ (ITA)

  1. 1. Project Modern C++ AKA « cppwinrt » Raffaele Rialdi @raffaeler raffaeler@vevy.com http://iamraf.net
  2. 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. 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. 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. 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. 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. 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. 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. 9. Configurazioni del progetto Win32 (non UWP) Necessario per le API Win32 del Windows Runtime Folder con cppwinrt Config per VC++2015
  10. 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; }
  11. 11. Codice!
  12. 12. Domande? Grazie!

×