DCSIMG
Accessing WinRT from Desktop Apps (Part 2) - Pavel's Blog
Sign in | Join | Help

Pavel's Blog

Pavel is a software guy that is interested in almost everything
software related... way too much for too little time

Accessing WinRT from Desktop Apps (Part 2)

In the previous post we’ve seen how to instantiate WinRT objects using the raw (Ro, pun intended) API. In this post, we’ll see some shortcuts to make our lives a little easier.

These shortcuts are part of the Windows Runtime template Library (WRL). This is a helper library, similar in spirit to the Active Template Library (ATL) used for classic COM work.

First we need to include the main WRL header, <wrl.h>. Also, we’ll include another header with some extra helpers, that are not included with the primary header:

#include <wrl.h>
#include <wrl/wrappers/corewrappers.h>

Next, we’ll add using namespace statements to make our lives a little easier:

using namespace Windows::Foundation;
using namespace Microsoft::WRL;
using namespace Microsoft::WRL::Wrappers;

Now for the real work in main().

To initialize WinRT on the current thread, we called RoInitialize() and at the end its counterpart, RoUninitialize(). A simple RAII class wraps these calls in the constructor/destructor, named RoInitializeWrapper:

RoInitializeWrapper init(RO_INIT_MULTITHREADED);

Next, we need an HSTRING that represents the Calendar’s full class name. Instead of calling WindowsCreateString etc., we can use the HString class wrapper provided by WRL:

HSTRING hClassName = HString::MakeReference(RuntimeClass_Windows_Globalization_Calendar).Get();

HString::MakeReference calls WindowsCreateStringReference, which is a way to create an “unmanaged” HSTRING, that does not need to be deleted because it points to memory that is already allocated in some other means; in this case, it’s a C-style string already defined in <windows.globalization.h> with the Calendar’s full class name.

To create the actual instance we’ll use another helper function, Windows::Foundation::ActivateInstance that accepts a class name (HSTRING) and returns an interface pointer to any supported interface. There’s no need to request IInspectable and then do a QueryInterface – the function takes care of that:

ComPtr<ICalendar> spCalendar;
HRESULT hr = ActivateInstance(hClassName, &spCalendar);

ComPtr<T> is WRL’s smart pointer (similar to CComPtr<T> from ATL).

That’s it. We can now use the Calendar in any way we want.

Comments List

# Using C++/CX in Desktop apps

Published at Saturday, September 29, 2012 4:20 PM by Pavel's Blog  

In my first and second post on using WinRT in a desktop app, we’ve used the raw API and then WRL to create

Leave a Comment

(required) 
(
required
)
 
(optional)
(required) 

Enter the numbers above: