请告知如何通过 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;
我试图找到 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;