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