我有应该移植到 Windows 8 Metro (WinRT) 的 C/C++ SDK 库。库大部分是独立于操作系统的,但它包含一些使用操作系统提供的 API 与硬件交互的模块。
在将其移植到 WinRT 时,我决定尽可能使用 WRL 而不是 C++/CX。所以现在我可以创建和使用大部分必需的 WinRT 对象。但是在使用由 WinRT 提供的异步对象时,我遇到了绝对的障碍。
例如,我使用以下代码枚举硬件设备:
// 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 对象?实际上,我只需要等待操作完成。