These Aren't the COM Objects You're Looking For November, 2018 - - PowerPoint PPT Presentation

these aren t the com objects you re looking for
SMART_READER_LITE
LIVE PREVIEW

These Aren't the COM Objects You're Looking For November, 2018 - - PowerPoint PPT Presentation

These Aren't the COM Objects You're Looking For November, 2018 Victor Ciura Technical Lead, Advanced Installer www.advancedinstaller.com Abstract Windows COM is 25 years old. Yet it is relevant today more than ever, because Microsoft has bet


slide-1
SLIDE 1

Victor Ciura

Technical Lead, Advanced Installer www.advancedinstaller.com

November, 2018

These Aren't the COM Objects You're Looking For

slide-2
SLIDE 2 X

Abstract

Windows COM is 25 years old. Yet it is relevant today more than ever, because Microsoft has bet its entire modern WinRT API on it (starting with Windows 8/10). But, if you’re familiar with the “old” COM with its idioms and SDK helper classes, you’re in for a treat. With the advent of modern C++ 17, using COM objects and new Windows APIs in your applications feels like a completely new experience. In this session, we’ll explore how using modern C++ features can radically transform the shape of your COM

  • code. By eliminating a lot of boilerplate, your code will be much more readable and maintainable. Classic COM

idioms around activation and QueryInterface() can feel totally different with modern C++ helpers. A beautiful example of modern COM usage is C++/WinRT (now part of Windows SDK). This is a standard C++ language projection for the new Windows Runtime API. COM memory management, data marshalling, string handling can all feel quite mechanical in nature and very error prone, so a little help from modern C++ facilities would be more than welcomed. Error handling and debugging can be cumbersome for COM like APIs; we’ll explore some tricks to improve this experience, as well.

2018 Victor Ciura | @ciura_victor
slide-3
SLIDE 3 2

⚙ Part 1 of N

2018 Victor Ciura | @ciura_victor

These Aren't the COM Objects You're Looking For

slide-4
SLIDE 4 3

Why are we talking about this ? Why COM ?

Have we really exhausted all the cool C++ template<> topics 😝 ?

2018 Victor Ciura | @ciura_victor
slide-5
SLIDE 5

Who Am I ?

@ciura_victor

4

Advanced Installer Clang Power Tools

2018 Victor Ciura | @ciura_victor
slide-6
SLIDE 6 5 2018 Victor Ciura | @ciura_victor

🙌

How many of you have done any COM programming in the last 20 years ?

slide-7
SLIDE 7 6 2018 Victor Ciura | @ciura_victor

🙌

How many of you are doing COM programming currently (this year) ?

slide-8
SLIDE 8 7 2018 Victor Ciura | @ciura_victor

Let's start using COM...

CoInitializeEx()

slide-9
SLIDE 9 8 2018 Victor Ciura | @ciura_victor

initializes the COM library for use by the calling thread sets the thread's concurrency model (COINIT_APARTMENTTHREADED, COINIT_MULTITHREADED) and creates a new apartment for the thread (if one is required)

CoInitializeEx()

Need to initialize the COM on a thread before any COM API calls,

  • therwise the function will return CO_E_NOTINITIALIZED
slide-10
SLIDE 10 9 2018 Victor Ciura | @ciura_victor

CoInitializeEx() must be called once for each thread that uses COM

CoInitializeEx()

Multiple calls to CoInitializeEx() by the same thread are allowed, but subsequent valid calls return S_FALSE Close COM gracefully on a thread: each successful call to CoInitializeEx(), must be balanced by a corresponding call to CoUninitialize()

slide-11
SLIDE 11 10 2018 Victor Ciura | @ciura_victor

“Do. Or do not. There is no try.” – Yoda

slide-12
SLIDE 12 11 2018 Victor Ciura | @ciura_victor

Any Trekkies in the room ?

slide-13
SLIDE 13 12 2018 Victor Ciura | @ciura_victor

Any Trekkies in the room ?

I'm sorry...

⚠ Some of this material may be unpleasant for you.

slide-14
SLIDE 14 13 2018 Victor Ciura | @ciura_victor

So, how can we fix COM init ?

CoInitializeEx()

slide-15
SLIDE 15 14 2018 Victor Ciura | @ciura_victor

RAII

slide-16
SLIDE 16 15 2018 Victor Ciura | @ciura_victor

class ComInitializerEx { public: ComInitializerEx(DWORD aComFlags) { HRESULT hRes = ::CoInitializeEx(nullptr, aComFlags); mClose = (hRes == S_OK); if ((hRes != S_OK) && (hRes != S_FALSE)) ATLASSERT(SUCCEEDED(hRes)); } ~ComInitializerEx() { if (mClose) ::CoUninitialize(); } private: bool mClose; // true if COM was initialized by this instance on this thread };

* some details omitted for brevity

slide-17
SLIDE 17 16 2018 Victor Ciura | @ciura_victor

Use it anywhere...

void FuncRequiringCom() { ComInitializerEx com(COINIT_MULTITHREADED); ... // use of COM APIs } class ClassRequiringCom { public: MethodsRequiringCom(); ... private: ComInitializerEx com_{ COINIT_MULTITHREADED }; };

👉 you can nest these objects

as needed

slide-18
SLIDE 18 17 2018 Victor Ciura | @ciura_victor

CoInitializerEx / RAII

You don't care about the thread you're on You don't care if you're already initialized on this thread You can nest these objects as needed You don't worry about closing/unloading COM when you're done

slide-19
SLIDE 19 18 2018 Victor Ciura | @ciura_victor

Let's Talk About Strings

slide-20
SLIDE 20 19 2018 Victor Ciura | @ciura_victor

What is the COM string type ?

BSTR

slide-21
SLIDE 21 20 2018 Victor Ciura | @ciura_victor

BSTR

typedef WCHAR OLECHAR; typedef OLECHAR * BSTR; A BSTR is a composite data type that consists of: Length prefix A four-byte integer that contains the number of bytes in the following data string. It appears immediately before the first character of the data string. This value does not include the terminator. Data string A string of Unicode characters. May contain multiple embedded null characters. Terminator A NULL (0x0000) WCHAR

slide-22
SLIDE 22 21 2018 Victor Ciura | @ciura_victor

BSTR

typedef WCHAR OLECHAR; typedef OLECHAR * BSTR; BSTR is a pointer Length prefix A four-byte integer that contains the number of bytes in the following data string. It appears immediately before the first character of the data string. This value does not include the terminator. Data string A string of Unicode characters. May contain multiple embedded null characters. Terminator A NULL (0x0000) WCHAR

slide-23
SLIDE 23 22 2018 Victor Ciura | @ciura_victor

BSTR

BSTR str = L"My first COM string"; This code: compiles links is incorrect (not working) If (by accident) you pass a string literal as an argument to a COM function that is expecting a BSTR, the COM function behaves unexpectedly. 🔦

slide-24
SLIDE 24 23 2018 Victor Ciura | @ciura_victor

BSTR

Allocating / Releasing Memory for a BSTR

BSTR str = ::SysAllocString(L"My first COM string");

🤧

if (str) { UseTheString(str); ... ::SysFreeString(str); }

slide-25
SLIDE 25 24 2018 Victor Ciura | @ciura_victor

“Somebody has to save our skins.” – Leia Organa

slide-26
SLIDE 26 25 2018 Victor Ciura | @ciura_victor

RAII FTW !

slide-27
SLIDE 27 26 2018 Victor Ciura | @ciura_victor

Visual C++ Compiler COM Support

#include <comutil.h>

Compiler RAII Support Classes:

_bstr_t _variant_t _com_ptr_t _com_error

(HRESULT wrapper)

slide-28
SLIDE 28 27 2018 Victor Ciura | @ciura_victor

_bstr_t

encapsulates the BSTR data type manages resource allocation through SysAllocString / SysFreeString and other APIs uses reference counting to avoid excessive overhead (CoW) provides various conversion constructors: const char*, const wchar_t*, BSTR, etc. provides various operators: =, +, ==, !=, +=, <, >, char*, wchar_t*, etc.

slide-29
SLIDE 29 28 2018 Victor Ciura | @ciura_victor

_bstr_t

_bstr_t str(L"My first COM string"); ComApiWithBstrParam(str.GetBSTR()); std::wstring my_std_str = str;

Also:

_bstr_t other_str(my_std_str.c_str()); if (str == other_str) // lexicographical compare { ... }

slide-30
SLIDE 30 29 2018 Victor Ciura | @ciura_victor

_com_ptr_t

_COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface)); declares the _com_ptr_t specialization: IMyInterfacePtr

COM interface smart pointer

slide-31
SLIDE 31 30 2018 Victor Ciura | @ciura_victor

_com_ptr_t

_COM_SMARTPTR_TYPEDEF(ITaskbarList3, __uuidof(ITaskbarList3)); ITaskbarList3Ptr taskBar; HRESULT hr = ::CoCreateInstance(CLSID_TaskbarList, nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&taskBar)); ATLASSERT(SUCCEEDED(hr)); if (taskBar) taskBar->SetProgressState(wnd, TBPF_INDETERMINATE);

slide-32
SLIDE 32 31 2018 Victor Ciura | @ciura_victor

Active Template Library ATL

🙌

slide-33
SLIDE 33 32 2018 Victor Ciura | @ciura_victor

ATL

A set of template-based C++ classes intended to simplify COM programming 🤕

slide-34
SLIDE 34 33 2018 Victor Ciura | @ciura_victor

template<class Base> class CComObject : public Base

CComObject<CMyCircle> * pCircle = nullptr; HRESULT hRes = CComObject<CMyCircle>::CreateInstance(&pCircle); ATLASSERT(SUCCEEDED(hRes)); pCircle->AddRef(); pCircle->SetRadius(5.2);

CComObject<>

slide-35
SLIDE 35 34 2018 Victor Ciura | @ciura_victor

CComObject<>

class ATL_NO_VTABLE CMyCircle : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CMyCircle, &CLSID_CMyCircle>, public IDispatchImpl<IMyCircle, &IID_IMyCircle, &LIBID_NVC_ATL_COMLib, 1, 0> { public: DECLARE_REGISTRY_RESOURCEID(IDR_MYCIRCLE) DECLARE_NOT_AGGREGATABLE(CMyCircle) BEGIN_COM_MAP(CMyCircle) COM_INTERFACE_ENTRY(IMyCircle) COM_INTERFACE_ENTRY(IDispatch) END_COM_MAP() DECLARE_PROTECT_FINAL_CONSTRUCT() ...

}

BOILERPLATE

slide-36
SLIDE 36 35 2018 Victor Ciura | @ciura_victor

class ATL_NO_VTABLE CMyCircle : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CMyCircle, &CLSID_CMyCircle>, public IDispatchImpl<IMyCircle, &IID_IMyCircle, &LIBID_NVC_ATL_COMLib, 1, 0> { ... HRESULT FinalConstruct() { return S_OK; } void FinalRelease() { } public: CMyCircle() { } STDMETHOD(SetRadius)(double val); ... };

CComObject<>

} Actual code we care about

slide-37
SLIDE 37 36 2018 Victor Ciura | @ciura_victor

“Your focus determines your reality.” – Qui-Gon Jinn

slide-38
SLIDE 38 37 2018 Victor Ciura | @ciura_victor

template<class Base> class CComObject : public Base

CComObject<>

Do you recognize this pattern ?

CRTP

slide-39
SLIDE 39 38 2018 Victor Ciura | @ciura_victor

template<class Base> class CComObject : public Base

CRTP

achieves a similar effect to the use of virtual functions without the costs of dynamic polymorphism (no VTABLE) binding done at compile time

This pattern is used extensively in the Windows ATL and WTL libraries.

slide-40
SLIDE 40 39 2018 Victor Ciura | @ciura_victor

“Power! Unlimited power!” — Darth Sidious

slide-41
SLIDE 41 40 2018 Victor Ciura | @ciura_victor

ATL

<comutil.h> ATL

_com_ptr_t CComPtr<T> _bstr_t CComBSTR _variant_t CComVariant

slide-42
SLIDE 42 41 2018 Victor Ciura | @ciura_victor

CComBSTR

ATL wrapper for the BSTR data type manages resource allocation through SysAllocString / SysFreeString and other APIs supports move semantics && provides various conversion constructors: const char*, const wchar_t*, BSTR, etc. provides various operators: =, +, ==, !=, +=, <, >, char*, wchar_t*, BSTR, etc.

slide-43
SLIDE 43 42 2018 Victor Ciura | @ciura_victor

CComBSTR str(L"My first COM string"); ComApiWithBstrParam(str); // operator BSTR() std::wstring my_std_str = str;

Also:

CComBSTR other_str(my_std_str.c_str()); if (str == other_str) // lexicographical compare { ... }

CComBSTR

slide-44
SLIDE 44 43 2018 Victor Ciura | @ciura_victor

“There’s always a bigger fish.” — Qui-Gon Jinn

slide-45
SLIDE 45 44 2018 Victor Ciura | @ciura_victor

ATL CString

supports both char and wchar_t through StringTraits policy manages resource allocation & deallocation uses reference counting to avoid excessive copy overhead (CoW) 50+ methods and operators typedef CStringT<TCHAR, StrTraitATL<TCHAR, ChTraitsCRT<TCHAR>>> CAtlString;

slide-46
SLIDE 46 45 2018 Victor Ciura | @ciura_victor

ATL CString

provides various conversion constructors: const char*, const wchar_t*, VARIANT, etc. provides various operators: =, +, ==, !=, +=, <, >, char*, wchar_t*, etc. provides tons of utility methods and string algorithms typedef CStringT<TCHAR, StrTraitATL<TCHAR, ChTraitsCRT<TCHAR>>> CAtlString; Eg. Find, FindOneOf, Format, MakeLower, MakeReverse, Left, Mid, Right, Replace, ReverseFind, Tokenize, Trim, etc.

slide-47
SLIDE 47 46 2018 Victor Ciura | @ciura_victor

CAtlString str(L"My first COM string"); ComApiWithBstrParam(str.AllocSysString()); // allocates an OLE BSTR copy std::wstring my_std_str = str.GetString(); // get null-term C string

Also:

CAtlString other_str(my_std_str.c_str()); if (str == other_str) // lexicographical compare { ... }

ATL CString

slide-48
SLIDE 48 47 2018 Victor Ciura | @ciura_victor

What about this modern COM I keep hearing about ? Surely things must have improved in the last 25 years...

slide-49
SLIDE 49 48 2018 Victor Ciura | @ciura_victor

Windows Runtime (WinRT)

Windows 8 / 10

slide-50
SLIDE 50 49 2018 Victor Ciura | @ciura_victor

“This is a new day, a new beginning.” – Ahsoka Tano

slide-51
SLIDE 51 50 2018 Victor Ciura | @ciura_victor

What is the Windows Runtime ?

Modern class-based, object-oriented Windows API Metadata about the classes/members Language projections for natural / familiar use (C++, C#, JavaScript, etc.)

slide-52
SLIDE 52 51 2018 Victor Ciura | @ciura_victor

How do I access the Windows Runtime from C++ ?

slide-53
SLIDE 53 52 2018 Victor Ciura | @ciura_victor

Windows Runtime C++ Template Library

WRL

enables you to more easily implement and consume COM components adds little abstraction over the Windows Runtime ABI (very thin wrapper) gives you the ability to control the underlying code (low-level access) error handling based on HRESULT design inspired by ATL => can be mixed with existing older COM code uses ISO standard C++ uses smart pointers & RAII rather verbose (boilerplate) supports UWP apps

slide-54
SLIDE 54 53 2018 Victor Ciura | @ciura_victor

Windows Runtime C++ Template Library

C++/CX

uses non-standard C++ language extensions terse syntax learning curve high-level abstraction represents HRESULT values as exceptions automates housekeeping tasks discontinued...

slide-55
SLIDE 55 54 2018 Victor Ciura | @ciura_victor

Let's start using Windows Runtime...

slide-56
SLIDE 56 55 2018 Victor Ciura | @ciura_victor

Init...

#include <Windows.Foundation.h> #include <wrl/wrappers/corewrappers.h> #include <wrl/client.h> using namespace ABI::Windows::Foundation; using namespace Microsoft::WRL; using namespace Microsoft::WRL::Wrappers;

WRL

slide-57
SLIDE 57 56 2018 Victor Ciura | @ciura_victor

Init...

RoInitializeWrapper init(RO_INIT_MULTITHREADED); if (FAILED(init)) { return PrintError(__LINE__, init); } Microsoft::WRL::Wrappers::RoInitializeWrapper

RAII

WRL

slide-58
SLIDE 58 57 2018 Victor Ciura | @ciura_victor

Using a class

ABI::Windows::Foundation::IUriRuntimeClassFactory // get the activation factory for IUriRuntimeClass interface ComPtr<IUriRuntimeClassFactory> uriFactory; HRESULT hr = GetActivationFactory( HStringReference(RuntimeClass_Windows_Foundation_Uri).Get(), &uriFactory); if (FAILED(hr)) { return PrintError(__LINE__, hr); }

WRL

slide-59
SLIDE 59 58 2018 Victor Ciura | @ciura_victor

What is the Windows Runtime string type ?

HSTRING

slide-60
SLIDE 60 59 2018 Victor Ciura | @ciura_victor

https://docs.microsoft.com/en-us/windows/desktop/WinRT/hstring

HSTRING

represents immutable string in the Windows Runtime (handle) WindowsCreateString() WindowsDeleteString() WindowsDuplicateString() WindowsConcatString() Usage:

slide-61
SLIDE 61 60 2018 Victor Ciura | @ciura_victor

https://docs.microsoft.com/en-us/windows/desktop/WinRT/hstring

HSTRING

HRESULT WindowsCreateString( PCNZWCH sourceString, UINT32 length, HSTRING *string );

😲

HRESULT WindowsDuplicateString( HSTRING string, HSTRING *newString ); HRESULT WindowsConcatString( HSTRING string1, HSTRING string2, HSTRING *newString ); HRESULT WindowsDeleteString( HSTRING string );

slide-62
SLIDE 62 61 2018 Victor Ciura | @ciura_victor

Microsoft::WRL::Wrappers::HString is the HSTRING wrapper from WRL

HSTRING

HString str; hr = str.Set(L"Hello"); if (FAILED(hr)) { return PrintError(__LINE__, hr); }

slide-63
SLIDE 63 62 2018 Victor Ciura | @ciura_victor

Platform::String is the language projection for C++/CX

HSTRING

Usage: Platform::String ^ s = L"Hello"; bool String::operator+ (String ^ str1, String ^ str2); bool String::operator== (String ^ str1, String ^ str2);

^

slide-64
SLIDE 64 63 2018 Victor Ciura | @ciura_victor

“You can’t stop the change, any more than you can stop the suns from setting.” — Shmi Skywalker

slide-65
SLIDE 65 64 2018 Victor Ciura | @ciura_victor

What is C++/WinRT ?

an ISO standard C++17 language projection for the Windows Runtime header-only library C++ class wrappers for WinRT APIs you can author and consume Windows Runtime APIs supersedes WRL and C++/CX

http://aka.ms/cppwinrt

slide-66
SLIDE 66 65 2018 Victor Ciura | @ciura_victor

What is C++/WinRT ?

https://github.com/Microsoft/cppwinrt

Windows SDK 10.0.17134.0

(Windows 10, version 1803)

http://aka.ms/cppwinrt

slide-67
SLIDE 67 66 2018 Victor Ciura | @ciura_victor

What is C++/WinRT ?

Project was started a few years back by Kenny Kerr. If you want to learn more about the project & history, checkout the links below: https://moderncpp.com http://cppcast.com/2015/05/kenny-kerr/ http://cppcast.com/2016/10/kenny-kerr/

https://kennykerr.ca/about/

slide-68
SLIDE 68 67 2018 Victor Ciura | @ciura_victor

What is C++/WinRT ?

https://www.youtube.com/watch?v=7TdpWB_vRZM

slide-69
SLIDE 69 68 2018 Victor Ciura | @ciura_victor

What is C++/WinRT ?

https://channel9.msdn.com/Events/Build/2018/BRK2425

Effective C++/WinRT for UWP and Win32 - Brent Rector, Kenny Kerr

Microsoft BUILD 2018

slide-70
SLIDE 70 69 2018 Victor Ciura | @ciura_victor

What is C++/WinRT ?

How to get it

Comes with Visual Studio 2017 (starting with v15.7) ✅ Select C++ workload

https://docs.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/intro-to-using-cpp-with-winrt

slide-71
SLIDE 71 70 2018 Victor Ciura | @ciura_victor

https://marketplace.visualstudio.com/items?itemName=CppWinRTTeam.cppwinrt101804264

C++/WinRT Visual Studio extension

Debug visualization of C++/WinRT projected types (similar to C# debugging) Project templates for getting started a C++/WinRT application MSBuild support for generating C++/WinRT projection headers and component skeletons

slide-72
SLIDE 72 71 2018 Victor Ciura | @ciura_victor

Let's start using Windows Runtime... (again)

slide-73
SLIDE 73 72 2018 Victor Ciura | @ciura_victor

Init...

#pragma comment(lib, "windowsapp") #include <winrt/base.h> #include <winrt/Windows.Foundation.h> using namespace winrt; using namespace Windows::Foundation; winrt::init_apartment();

C++/WinRT

cl /std:c++17 /EHsc /W4 /WX /I"%WindowsSdkDir%Include\%UCRTVersion%\cppwinrt"

slide-74
SLIDE 74 73 2018 Victor Ciura | @ciura_victor

performs better and produces smaller binaries than any other language projection

  • utperforms handwritten code using the ABI interfaces directly (eg. WRL)

the underlying abstractions use modern C++ idioms, that the Visual C++ compiler is designed to optimize (magic statics, empty base classes, strlen() elision)

C++/WinRT

slide-75
SLIDE 75 74 2018 Victor Ciura | @ciura_victor

What is the C++/WinRT string type ?

winrt::hstring

slide-76
SLIDE 76 75 2018 Victor Ciura | @ciura_victor

winrt::hstring

winrt::hstring str(L"Hello!");

Represents an immutable string consistent with the underlying HSTRING

slide-77
SLIDE 77 76 2018 Victor Ciura | @ciura_victor

winrt::hstring

Encapsulates HSTRING behind an interface similar to that of std::wstring

hstring() noexcept; hstring(hstring const & h); explicit hstring(std::wstring_view const & v); hstring(wchar_t const * c); hstring(wchar_t const * c, uint32_t s);

slide-78
SLIDE 78 77 2018 Victor Ciura | @ciura_victor

void Test(hstring const & theHstring, wstring_view const & theWstringView, wchar_t const * wideLiteral, wstring const & wideString) { hstring fromDefault{}; hstring fromHstring{ theHstring }; hstring fromWstringView{ theWstringView }; hstring fromWideLiteral{ wideLiteral }; hstring fromWideString{ wideString.c_str() }; hstring fromWideLiteralWithSize{ wideLiteral, 256 }; hstring fromWideStringWithSize{ wideString.c_str(), 256 }; }

slide-79
SLIDE 79 78 2018 Victor Ciura | @ciura_victor

winrt::hstring

Uri uri{ L"http://example.com" }; // uses hstring's conversion operator to std::wstring_view std::wstring domain { uri.Domain() }; hstring Uri::Domain() const;

  • perator std::wstring_view() const noexcept;
slide-80
SLIDE 80 79 2018 Victor Ciura | @ciura_victor

winrt::hstring

hstring theHstring; for (const auto & element : theHstring) { std::wcout << element; }

An hstring is a range, so you can use it with range-based for, or with std::for_each

slide-81
SLIDE 81 80 2018 Victor Ciura | @ciura_victor

winrt::hstring

winrt::hstring w{ L"Hello!" }; std::string c = winrt::to_string(w); WINRT_ASSERT(c == "Hello!"); w = winrt::to_hstring(c); WINRT_ASSERT(w == L"Hello!");

hstring is UTF16, but it plays nice with UTF-8 text

slide-82
SLIDE 82 81 2018 Victor Ciura

ATL CString Platform::String QString wxString const char* const wchar_t* XString folly::fbstring MFC CString std::string WTF::String WTF::CString winrt::hstring BSTR _bstr_t CComBSTR

slide-83
SLIDE 83 82 2018 Victor Ciura | @ciura_victor

“I’m just a simple man trying to make my way in the universe.” — Jango Fett

slide-84
SLIDE 84 83 2018 Victor Ciura

const char* XString std::string

🔢 const char[N]

So we ended up with something like this...

↔ ↔

+ glue code

slide-85
SLIDE 85 84 2018 Victor Ciura

const char* XString std::string

🔢 const char[N] ↔ ↔ ⚙ String Algorithms

slide-86
SLIDE 86 85 2018 Victor Ciura | @ciura_victor

Enough string_view to hang ourselves

www.youtube.com/watch?v=xwP4YCP_0q0 CppCon 2018

I have a whole talk just on C++17 std::string_view

slide-87
SLIDE 87 86 2018 Victor Ciura

Is C++17 string_view the answer to all our string problems ?

slide-88
SLIDE 88 87 2018 Victor Ciura

A lightweight string-like view into an array of characters. It can be constructed from a const char* (null terminated) or from a pointer and a length. Intended to be used as glue code, to avoid large overload sets. std::string_view

slide-89
SLIDE 89 88 2018 Victor Ciura

A string_view does not manage the storage that it refers to. Lifetime management is up to the user (caller). std::string_view

slide-90
SLIDE 90 89 2018 Victor Ciura

Convenience Conversions (and Gotchas)

  • const char * automatically converts to std::string via constructor (not explicit)
  • const char * automatically converts to std::string_view via constructor (not explicit)
  • std::string automatically converts to std::string_view via conversion operator
  • can construct a std::string from a std::string_view via constructor (explicit)
slide-91
SLIDE 91 90 2018 Victor Ciura

Design goal: avoid temporary std::string objects. std::string_view was designed to interoperate with std::string 😉 Caveat: comes with some usage complexity (gotchas). std::string_view

slide-92
SLIDE 92 91 2018 Victor Ciura | @ciura_victor

“It’s a trap!” – Admiral Ackbar

slide-93
SLIDE 93 92 2018 Victor Ciura | @ciura_victor

On COM...

Windows COM is 25 years old... and it shows this in many corners. Yet it is relevant today more than ever, because Microsoft has bet its entire modern WinRT API on it. With the advent of C++17, using COM objects and new WinRT APIs feels like a completely new experience.

slide-94
SLIDE 94 93 2018 Victor Ciura | @ciura_victor

“The dark side of the COM is a pathway to many abilities some consider to be unnatural.” — Chancellor Palpatine

slide-95
SLIDE 95 94 2018 Victor Ciura | @ciura_victor

One more thing...

slide-96
SLIDE 96 95 2018 Victor Ciura | @ciura_victor

xlang

NEW

slide-97
SLIDE 97 96 2018 Victor Ciura | @ciura_victor

xlang

cross-language cross-compiler cross-platform generalization of WinRT

https://kennykerr.ca/2018/10/10/xlang/

slide-98
SLIDE 98 97 2018 Victor Ciura | @ciura_victor

application ( language B ) library ( language A )

Operating System ( Windows 7-10, Linux, MacOS, iOS )

xlang

language projection

API

slide-99
SLIDE 99 98 2018 Victor Ciura | @ciura_victor

xlang

  • pen-source

https://github.com/Microsoft/xlang

WIP experimental

slide-100
SLIDE 100 99 2018 Victor Ciura | @ciura_victor

xlang

https://github.com/Microsoft/xlang

a solid metadata reader ( ISO C++17 ) incredibly fast and portable abstraction

  • ver the ECMA-335 format (WinRT)

Goal: to reach feature parity with C++/WinRT

slide-101
SLIDE 101 100 2018 Victor Ciura | @ciura_victor

What xlang project is NOT

https://github.com/Microsoft/xlang

xlang is not a port of the Windows Runtime, COM, DCOM xlang will not port the Windows Runtime APIs

slide-102
SLIDE 102 101 2018 Victor Ciura | @ciura_victor

“Great, kid. Don’t get cocky.” – Han Solo

slide-103
SLIDE 103 X

C++ Slack is your friend

CppLang Slack auto-invite: https://cpplang.now.sh/

https://cpplang.slack.com

2018 Victor Ciura | @ciura_victor
slide-104
SLIDE 104 X

Rob Irving @robwirving Jason Turner @lefticus

2018 Victor Ciura | @ciura_victor
slide-105
SLIDE 105 X

Jon Kalb @_JonKalb Phil Nash @phil_nash

http://cpp.chat

https://www.youtube.com/channel/UCsefcSZGxO9lTBqFbsV3sJg/ https://overcast.fm/itunes1378325120/cpp-chat

2018 Victor Ciura | @ciura_victor
slide-106
SLIDE 106

Victor Ciura

Technical Lead, Advanced Installer www.advancedinstaller.com

November, 2018

These Aren't the COM Objects You're Looking For

@ciura_victor

slide-107
SLIDE 107 X

Questions 🗤

@ciura_victor

2018 Victor Ciura | @ciura_victor