The cppwinrt project focused to consume Microsoft provided OS winrt components and it doesn’t support building a winrt component(yet) although they mentioned it will be supported later.
Even though it’s not technically supported yet, we still can create a winrt component with WRL(pure C++ and non C++/CX) and still can get some benefits from using cppwinrt within WRL component.
For example, I created a WinRT sample component with WRL and exports IAsyncAction async methods from it. Inside the method, I utilized the cppwinrt provided coroutine method which easily can produce IAsync operations. See the following:
https://github.com/heejune/wrl-cppwinrt-sample/blob/async-support/SampleLib.Shared/DemoCore.cpp
There’s a DemoCore::GetCppwinrtDataasync method defined as this:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
winrt::Windows::Foundation::IAsyncOperation<int> GetAsyncOp() | |
{ | |
using namespace winrt; | |
using namespace Windows::Foundation; | |
for (int i = 0; i != 5; ++i) | |
{ | |
co_await 5000ms; | |
} | |
co_return 1; | |
} | |
STDMETHODIMP DemoCore::GetCppwinrtDataAsync(::ABI::Windows::Foundation::IAsyncOperation<int>** value) | |
{ | |
auto asyncOp = GetAsyncOp(); | |
*value = reinterpret_cast<::ABI::Windows::Foundation::IAsyncOperation<int>*>(winrt::detach(asyncOp)); | |
return S_OK; | |
} |
It just (detached and) returns the object which also returned from GetAsyncOp private method. GetAsyncOp is a coroutine function which also creates an instance of winrt::Windows::Foundation::IAsyncOperation. And that’s the winrt implementation of IAsyncOperation.
You can download the source project and test it from https://github.com/heejune/wrl-cppwinrt-sample/tree/async-support
Thanks,
Heejune
2 thoughts on “Building WinRT component with WRL(non C++/CX) and cppwinrt”