Проблема в том, что функция 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;
}
Я использовал следующие настройки свойств.