请告知如何通过 C++/WinRT 进行 ReadAsync

Please advise how for ReadAsync by C++/WinRT

我试图找到 StorageFile 的 OpenAsync、适用于 C++/WinRT 的 ReadAsync 非常困难。 (并尝试在 UWP 中使用 C# 进行测试,它没有问题。我最初是使用 C++ MFC 开发的。)

Windows::Foundation::IAsyncAction MainPage::FilePickerAsync()
{
    auto picker = FileOpenPicker();

    picker.ViewMode( PickerViewMode::List );

    picker.FileTypeFilter().Append( L".cpp" );

    StorageFile file = co_await picker.PickSingleFileAsync();

    try
    {
            IRandomAccessStream stream = co_await file.OpenAsync( FileAccessMode::Read );

            uint64_t size64 = stream.Size();                                        // <= Error

            uint32_t size32 = static_cast< uint32_t >( size64 ); 

            auto buffer = Buffer( size32 );

            co_await stream.ReadAsync( buffer, size32, InputStreamOptions::None );  // <= Error

            stream.Close(); 
    }
    catch ( const hresult_error &ex )
    {
    }
}   

Visual C++ 2019

错误 C3779 'winrt::impl::consume_Windows_Storage_Streams_IRandomAccessStream <winrt::Windows::Storage::Streams::IRandomAccessStream>::Size': returns 'auto' 在定义之前无法使用的函数

错误 C3779 'winrt::impl::consume_Windows_Storage_Streams_IInputStream<< D >>::ReadAsync': returns 'auto' 在定义之前无法使用的函数

a function that returns 'auto' cannot be used before it is defined

正如@Hans Passant 推荐 Raymond Chen 的blog,

关键是 前向声明的方法被声明为 returning auto,没有尾随 return 类型和主体。这意味着“我希望编译器推断出 return 类型(但我还没有提供任何线索)。”如果您尝试在方法实现之前调用该方法,那么编译器会报告错误,因为它还没有确定 return 类型的必要信息.

您需要添加特定的头文件,然后在主页中添加命名空间 class,如下所示。

pch 文件

  include <winrt/Windows.Storage.Pickers.h>
  include <winrt/Windows.Storage.Streams.h>

MainPage 命名空间

using namespace Windows::Storage::Pickers;
using namespace Windows::Storage::Streams;
using namespace Windows::Storage;