co_await表达式需要await_ready函数

时间:2018-10-16 16:39:13

标签: c++ winapi c++-winrt

我有一个Win32程序,我想在其中添加一些winRT调用。除其他外,我想打开没有GUI界面的文件。

我使用来自StorageFile类的异步文件打开调用,因为下一个调用需要IStorageFile接口。

#include <roapi.h>
#include <winrt/Windows.Storage.h> 
#include <winrt/Windows.Foundation.h>

void openFile()
{
   using namespace winrt;
   using namespace winrt::Windows::Foundation;
   using namespace winrt::Windows::Storage;

   HRESULT rtn = RoInitialize(RO_INIT_MULTITHREADED); 
   winrt::hstring path{ L"C:\\Users...\\mytextfile.txt"};

   //wait for open the file 
   auto file = co_await StorageFile::GetFileFromPathAsync(path);

   //IStorageFile interface needed  
}

int main()
{
  openFile(); 
  return 0;
}

目前,编译器抱怨co_await表达式需要合适的“ await_ready”函数,但未找到任何函数。

我不确定是否由于缺少标头包含而导致这种情况,或者无法在Win32应用程序中使用“ co_await”。

编辑: 我的Visual Studio项目设置为: -使用c ++ 17,将cppwinrt.exe添加到我的包含目录中,链接到Windowsapp.lib并使用Windows sdk版本10.0.17134.0。

1 个答案:

答案 0 :(得分:3)

问题是openFile()函数没有正确的返回类型来处理co_await

查看为我为C++11 threads to update MFC application windows. SendMessage(), PostMessage() required?创建的答案而进行的研究和工作,其中包含针对各种协程方法的建议列表。

这个问题是关于在MFC中使用C ++ / WinRT,但该材料也适用于WinAPI。

另请参见synchronizing SDK with Windows 10 update and using WinRT with Standard C++,其中包含一个简单的控制台应用程序示例,该示例使用Web Syndication异步功能从RSS提要中检索URL列表。有许多指向文档的链接,其中有些现在已过时。

附录:示例控制台应用程序

我使用Visual Studio 2017创建了以下简单控制台应用程序。创建了文本文件,然后在调试器中运行了该文件。然后,我重命名了该文本文件,然后在调试器中再次运行它,并且由于该名称的文件不再存在而引发了异常。

另请参见C++/WinRT, part of Windows SDK 17134 is not compatible with Visual Studio 15.8 Preview 3,其中描述了您可能需要更改的编译器选项。我做到了。

// console_winrt.cpp : This file contains the 'main' function. Program execution begins and ends there.
//
// Requires the following changes to the project properties in the C++ compiler section.
//   - C++ language standard must be set to C++17
//   - Add /await to the Additional options

#include "pch.h"

#pragma comment(lib, "windowsapp")

#include <winrt/Windows.Storage.h> 
#include <winrt/Windows.Foundation.h>

#include <iostream>

winrt::Windows::Foundation::IAsyncAction  openMyFile()
{

    winrt::hstring path{ L"D:\\Users\\rickc\\mytextfile.txt" };

    //wait for open the file 
    auto file = co_await winrt::Windows::Storage::StorageFile::GetFileFromPathAsync(path);

    //IStorageFile interface needed 
    auto xDate = file.DateCreated();
    std::cout << "file was found " << std::endl;
}

int main()
{
    // initialize the WinRT apartment.
    winrt::init_apartment();

    auto x = openMyFile();

    // wait on the file access since that is all we are doing and we need to give it time.
    x.get();
    return 0;
}

我使用了以下属性设置。

Properties dialog screen shot showing General Properties

Properties dialog screen shot showing C/C++ All options