Выражение co_await нуждается в функции await_ready

У меня есть программа 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 в мои каталоги включения, создайте ссылку на windowsapp.lib и используйте windows sdk версии 10.0.17134.0.

2

Решение

Проблема в том, что 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;
}

Я использовал следующие настройки свойств.

Снимок экрана диалога свойств, показывающий общие свойства

Снимок экрана диалога свойств, показывающий C / C ++ Все параметры

2

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector