Со ссылкой на мой предыдущий вопрос — Как получить дескриптор главного окна на странице в WinUI 3 с помощью C++
Я изучаю WinUI3 с помощью С++ и изо всех сил пытаюсь найти информацию и материалы на другом портале сообщества.
Я разработал демонстрационное приложение с окном и двумя страницами. На одной из страниц я хочу открыть средство выбора файлов.
Tab1Page.xaml.cpp
void winrt::App1::implementation::Tab1Page::Button_Click(winrt::Windows::Foundation::IInspectable const& sender, winrt::Microsoft::UI::Xaml::RoutedEventArgs const& e)
{
OutputTextBlock().Text(OutputTextBlock().Text() + L"Button Clicked\n");
auto hwnd = GetProcessFirstWindowHandle();
auto picker = winrt::Windows::Storage::Pickers::FileOpenPicker();
//Initialize the folder picker with the window handle(HWND).
auto initializeWithWindow{ picker.as<::IInitializeWithWindow>() };
initializeWithWindow->Initialize(hwnd);
picker.SuggestedStartLocation(winrt::Windows::Storage::Pickers::PickerLocationId::Desktop);
winrt::Windows::Storage::StorageFile file = picker.PickSingleFileAsync().get();
}
Ошибка
winrt::Windows::Storage::StorageFile file = picker.PickSingleFileAsync().get();
Исключение по адресу 0x00007FF9A92706BC в App1.exe: исключение Microsoft C++: winrt::hresult_error в ячейке памяти 0x0000007EA60F9B88.
Вероятно, это аварийное отключение, вызванное синхронным ожиданием в потоке пользовательского интерфейса (вызов .get()
).
@IInspectable Я также использовал winrt::fire_and_forget
и co_wait
, но с тем же исключением.
Не могли бы вы сообщить нам, каково значение HRESULT ошибки? Вы увидели ошибку в выводе или получили ошибку в своем коде?
@Jeaninez-MSFT Я думаю, что что-то не так со значениями файлового фильтра. Вот что я получил в окнах вывода: «Свойство FileType Filter должно иметь хотя бы один указанный фильтр типа файла». Но я все еще сомневаюсь, что это связано либо с потоком пользовательского интерфейса, либо с обработчиком окна.
@RaymondChen Пожалуйста, проверьте это - Исключение возникло по адресу 0x00007FF9A92706BC (KernelBase.dll) в App1.exe: исходная ошибка WinRT - 0x80004005: «В свойстве FileTypeFilters должен быть указан хотя бы один фильтр типа файла». onecoreuap\shell\twinui\pickercore\api\lib\winrtpicker.cpp(943)\twinui.appcore.dll!00007FF9813081F6: (вызывающий: 00007FF9AB5D5583) ReturnHr(1) tid(37d0) 80004005 Неопределенная ошибка CallContext:[ \PickSingleFileAsync] Исключение по адресу 0x00007FF9A92706BC в App1.exe: исключение Microsoft C++: winrt::hresult_error в ячейке памяти 0x0000004B58129808.
@Jeaninez-MSFT Пожалуйста, проверьте это — Исключение по адресу 0x00007FF9A92706BC (KernelBase.dll) в App1.exe: исходная ошибка WinRT — 0x80004005: «В свойстве FileTypeFilters должен быть указан хотя бы один фильтр типа файла». onecoreuap\shell\twinui\pickercore\api\lib\winrtpicker.cpp(943)\twinui.appcore.dll!00007FF9813081F6: (вызывающий: 00007FF9AB5D5583) ReturnHr(1) tid(37d0) 80004005 Неопределенная ошибка CallContext:[ \PickSingleFileAsync] Исключение по адресу 0x00007FF9A92706BC в App1.exe: исключение Microsoft C++: winrt::hresult_error в ячейке памяти 0x0000004B58129808.
У тебя две проблемы
так что это должно работать:
Windows::Foundation::IAsyncAction winrt::App1::implementation::Tab1Page::Button_Click(IInspectable const& sender, RoutedEventArgs const& args)
{
auto hwnd = GetFirstProcessWindowHandle();
auto picker = winrt::Windows::Storage::Pickers::FileOpenPicker();
picker.FileTypeFilter().Append(L"*");
auto initializeWithWindow{ picker.as<IInitializeWithWindow>() };
initializeWithWindow->Initialize(hwnd);
picker.SuggestedStartLocation(winrt::Windows::Storage::Pickers::PickerLocationId::Desktop);
auto file = co_await picker.PickSingleFileAsync();
}
Спасибо Саймон. Я также решил это. Вы опубликовали ответ, пока я редактировал свой ответ: D Большое спасибо. Я сделал ошибку, не заглянув в детали окна вывода.
Пушка сопрограммы: сопрограмма должна делать одну из двух вещей: 1
принимать аргументы по значению или 2
оставлять const&
, но удалять имена, чтобы аргументы не использовались. С сопрограммами ссылки становятся недействительными в первой точке приостановки.
Внутри исключения будет HRESULT. Что такое ХРЕЗУЛЬТАТ?