Как установить GetFilesAsync в последней версии cppwinrt? - PullRequest
0 голосов
/ 25 октября 2018

С помощью людей cppwinrt мне ранее удавалось перечислять файлы в StorageFolder;в то время мне не хватало необходимого #include.Работал нормально, пока я не перестроил приложение, используя в качестве отправной точки BlankApp, теперь предоставляемый Visual Studio 15.9.0 Preview 3 в качестве шаблона C ++ / WinRT.Теперь тот же код выдает ошибку ссылки, которую я не могу пропустить.Позвольте мне процитировать ошибочную строку: это часть класса, который я называю ResourceManager;он содержит ссылку на папку, определенную следующим образом:

IVectorView<StorageFile> m_activity_files = nullptr;

Затем у класса есть метод, объявленный как

IAsyncAction LoadActivities();

, который co_awaits вызывает вызов, чтобы получить соответствующий StorageFolder как m_activities_folder икак только это будет сделано, попытается перечислить содержимое папки:

m_activity_files = co_await m_activities_folder.GetFilesAsync(CommonFileQuery::DefaultQuery);

И вот в чем проблема.То, что раньше работало нормально, теперь приводит к следующей ошибке ссылки:

Error   LNK2019 unresolved external symbol "public: struct winrt::Windows::Foundation::IAsyncOperation<struct winrt::Windows::Foundation::Collections::IVectorView<struct winrt::Windows::Storage::StorageFile> > __thiscall winrt::impl::consume_Windows_Storage_Search_IStorageFolderQueryOperations<struct winrt::Windows::Storage::StorageFolder>::GetFilesAsync(enum winrt::Windows::Storage::Search::CommonFileQuery const &)const " (?GetFilesAsync@?$consume_Windows_Storage_Search_IStorageFolderQueryOperations@UStorageFolder@Storage@Windows@winrt@@@impl@winrt@@QBE?AU?$IAsyncOperation@U?$IVectorView@UStorageFile@Storage@Windows@winrt@@@Collections@Foundation@Windows@winrt@@@Foundation@Windows@3@ABW4CommonFileQuery@Search@Storage@63@@Z) referenced in function "public: struct winrt::Windows::Foundation::IAsyncAction __thiscall AppEngine::ResourceManager::LoadActivities$_ResumeCoro$2(void)" (?LoadActivities$_ResumeCoro$2@ResourceManager@AppEngine@@QAE?AUIAsyncAction@Foundation@Windows@winrt@@XZ)

(сопровождаемый путем к объектному файлу). Включения и пространства имен такие же, как и раньше, и, кажется, не имеет значения,Я не использую полностью уточненные имена в аргументах.

#include "winrt/Windows.ApplicationModel.h"
#include "winrt/Windows.Storage.h"
#include "winrt/Windows.Storage.Streams.h"
#include "winrt/Windows.Foundation.Collections.h"
#include "winrt/Windows.Storage.Search.h"
#include "winrt/Windows.UI.Core.h"
#include "pch.h"
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Foundation::Collections;
using namespace Windows::Storage;
using namespace Windows::Storage::Provider;
using namespace Windows::Storage::Search;
using namespace Windows::Storage::Streams;

Но я не могу понять, в чем проблема.Похоже, что что-то изменилось в последних версиях C ++ / WinRT и SDK 10.0.17666.0.Что я действительно хотел бы увидеть, так это (для каждого метода, на самом деле) несколько строк примера кода, демонстрирующих использование C ++ / WinRT, но пока достаточно просто решить эту проблему!

[ОБНОВЛЕНИЕ]Важно, что ошибка ссылки относится к IAsyncOperation, когда этот вызов выполняется в методе с типом возвращаемого значения IAsyncAction?

[Обновление 2] Использование примера приложения PhotoEditor в качестве модели. Я подумал, что, возможно, будет лучше создатьFileQuery и запустите GetFilesAsync на этом.Итак:

QueryOptions options{};
        options.FolderDepth(FolderDepth::Shallow);
        options.FileTypeFilter().Append(L".act");
        auto result = m_activities_folder.CreateFileQueryWithOptions(options);
auto activityFiles = co_await result.GetFilesAsync();

Конечно, Windows.Storage.Search уже включен в #, а его пространство имен объявлено, как указано выше.Но теперь я получаю дополнительную ошибку ссылки на QueryOptions:

Error   LNK2019 unresolved external symbol "public: __thiscall winrt::Windows::Storage::Search::QueryOptions::QueryOptions(void)" (??0QueryOptions@Search@Storage@Windows@winrt@@QAE@XZ) referenced in function "public: struct winrt::Windows::Foundation::IAsyncAction __thiscall AppEngine::ResourceManager::LoadActivities$_ResumeCoro$2(void)" (?LoadActivities$_ResumeCoro$2@ResourceManager@AppEngine@@QAE?AUIAsyncAction@Foundation@Windows@winrt@@XZ)

Может ли быть какая-то базовая проблема с настройками проекта BlankApp?

1 Ответ

0 голосов
/ 29 октября 2018

ОК, вот что я сделал, и это сработало.Во-первых, я отказался от использования CommonFileQuery.Вместо

m_activity_files = co_await m_activities_folder.GetFilesAsync(winrt::Windows::Storage::Search::CommonFileQuery::DefaultQuery);

я просто использовал

m_activity_files = co_await activitiesFolder.GetFilesAsync();

И это построено.Затем я обнаружил, что при использовании метода StorageFolder для получения внутренней папки происходит сбой, поэтому теперь я получаю нужную папку, используя ее путь:

std::wstring path{ Windows::ApplicationModel::Package::Current().InstalledLocation().Path() + L"\\Assets\\Activities" };
Windows::Storage::StorageFolder activitiesFolder{ co_await Windows::Storage::StorageFolder::GetFolderFromPathAsync(path) };

И это работает!Процесс достижения успеха казался почти случайным, но я в порядке, пока он работает.Я действительно задаюсь вопросом, почему я не могу нацелиться на последний выпуск SDK, так как его версия более поздняя, ​​чем 17666, на которую я нацеливаюсь прямо сейчас.Спасибо всем, кто внес предложения.

...