Windows 8 Metro (WinRT) に移植する必要がある C/C++ SDK ライブラリがあります。ライブラリはほとんど OS に依存しませんが、OS 提供の API を使用してハードウェアとやり取りするモジュールがいくつか含まれています。
これを WinRT に移植する際に、可能な限り C++/CX の代わりに WRL を使用することにしました。これで、必要な WinRT オブジェクトのほとんどを作成して使用できるようになりました。しかし、WinRT によって提供される Async オブジェクトを操作しているときに、絶対的な障害に直面しました。
たとえば、次のコードを使用して HW デバイスを列挙します。
// create interface to "static" members of DeviceInformation class
ComPtr<IDeviceInformationStatics> DeviceInformationStatics;
HRESULT hr = GetActivationFactory(HString::MakeReference(RuntimeClass_Windows_Devices_Enumeration_DeviceInformation).Get(), &DeviceInformationStatics);
ComPtr<IAsyncOperation<DeviceInformationCollection*>> operation;
hr = DeviceInformationStatics->FindAllAsyncDeviceClass( DeviceClass_All, &operation);
この時点で、有効な IAsyncOperation ポインターがあります。私はそれが次のように使用できると思いました:
task<ComPtr<DeviceInformationCollection*>> tsk(operation);
しかし、IAsyncOperation を受け入れる task<> コンストラクターが ppltasks.h の "#if defined(__cplusplus_winrt)" の下で宣言されているため、失敗しました。これは、/ZW コンパイラー オプションに依存します。
この場合、IAsyncOperation オブジェクトをどのように使用すればよいですか? 実際には、操作が完了するのを待つだけです。