Выражение co_await нуждается в функции await_ready - PullRequest
0 голосов
/ 16 октября 2018

У меня есть программа Win32, куда я хочу добавить несколько вызовов winRT.Среди прочего я хочу открыть файл без графического интерфейса.

Я использую асинхронный вызов открытия файла из класса 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", и ничего не найдено.

Я не уверен, так ли это из-за отсутствующего заголовка include или если "co_await" нельзя использовать в приложении win32.

Редактировать: Моя настройка проекта Visual Studio: - используйте c ++ 17, добавьте cppwinrt.exe в мои каталоги include, создайте ссылку на windowsapp.lib и используйте windows sdk версии 10.0.17134.0.

1 Ответ

0 голосов
/ 16 октября 2018

Проблема в том, что функция openFile() не имеет правильного типа возвращаемого значения для обработки co_await.

См. Исследование и работу, посвященную ответу, который я создал для C ++11 потоков для обновления окон приложений MFC.SendMessage (), PostMessage () требуется? , который содержит список рекомендаций для различных подходов к сопрограммам.

Этот вопрос касался использования C ++ / WinRT с MFC, но материал также применим к WinAPI.

См. Также синхронизация SDK с обновлением Windows 10 и использование WinRT со стандартным C ++ , который содержит простой пример консольного приложения, использующего асинхронную функцию Web Syndication для получения списка URL-адресов из RSS-канала.Существует несколько ссылок на документацию, некоторые из которых немного устарели.

Приложение: Пример консольного приложения

Я создал следующее простое консольное приложение, используяVisual Studio 2017. Я создал текстовый файл и запустил его в отладчике.Затем я переименовал текстовый файл и снова запустил его в отладчике, и возникло исключение, поскольку файл с таким именем больше не существует.

См. Также C ++ / WinRT, часть Windows SDK 17134 не являетсясовместим с 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

...