Как перечислить содержимое папки в октябре 2018

Пытаясь перевести в cppwinrt метод StorageFolder GetFilesAsync, я не могу получить ошибки ссылок компилятора. Вот очень простая процедура для проверки концепции:

#include "winrt/Windows.Storage.h" 
#include "winrt/Windows.Foundation.Collections.h"
IAsyncAction TestClass::LoadFiles()
{
    StorageFolder appFolder = Windows::ApplicationModel::Package::Current().InstalledLocation(); 
    StorageFolder assetsFolder = co_await appFolder.GetFolderAsync(hstring(L"Assets")); 
    auto files = co_await assetsFolder.GetFilesAsync(CommonFileQuery::DefaultQuery); 
}

Проблема, похоже, заключается в типе возврата для GetFilesAsync. Я пробовал различные типы для этого, например, IVectorView, но, похоже, ничего не работает. Кто-нибудь знает пример кода, показывающий, как это перечисление может быть выполнено в C++ / winrt?

[ОБНОВЛЕНИЕ] Возвращаясь к этому проекту с SDK 10.0.17666 и VS 15.9.0 Preview 3, я обнаружил, что решение, принятое ранее из этих ответов, больше не работает. На этот раз я обязательно включу полную ошибку, чтобы узнать, есть ли у кого-нибудь идеи. Для простоты я буду использовать только простой код, предоставленный IInspectable, измененный только для того, чтобы сделать его членом класса в моем классе ResourceManager:

 #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::Storage;
using namespace Windows::Storage::Search;

IAsyncAction ResourceManager::LoadActivities()
{
    StorageFolder appFolder = Windows::ApplicationModel::Package::Current().InstalledLocation();
    StorageFolder assetsFolder = co_await appFolder.GetFolderAsync(L"Activities");
    auto files = co_await assetsFolder.GetFilesAsync(CommonFileQuery::DefaultQuery);
}

Вызов GetFilesAsync теперь приводит к следующей ошибке ссылки: Код серьезности Описание Ошибка состояния подавления строки файла проекта LNK2019 неразрешенный внешний символ "public: struct winrt::Windows::Foundation::IAsyncOperation > __thiscall winrt::impl:: потребление_Windows_Storage_Search_IStorageFolderQueryOperationc::Get (enum winrt::Windows::Storage::Search::CommonFileQuery const &)const " (?GetFilesAsync@?$consumer_Windows_Storage_Search_IStorageFolderQueryOperations@UStorageFolder@Storage@Windows@winrt@@@impl@winrt@@QBE?Aync $ U?$IVectorView@UStorageFile@Storage@Windows@winrt@@@Collections@Foundation@Windows@winrt@@@Foundation@Windows@3@ABW4CommonFileQuery@Search@Storage@63@@Z), упоминаемый в функции "public: struct winrt"::Windows::Foundation::IAsyncAction __thiscall AppEngine::ResourceManager::LoadActivities$_ResumeCoro$2(void)" (?LoadActivities$_ResumeCoro$2@ResourceManager@AppEngine@@QAE?AUIAsyncAction@Foundation@Windows@winrt@ Foundation @ Windows @ winrt @

(сопровождается путем к объектному файлу)

Я должен признать, что нахожу это сообщение об ошибке трудно расшифровать. Возможно, у кого-то еще есть идея? Должно быть что-то, что изменилось в последних обновлениях системы.

1 ответ

Решение

Для чего это стоит, следующий автономный код собирается просто отлично. Таким образом, вы, вероятно, либо пропускаете библиотеку #include или библиотеки ссылок, но невозможно сказать, когда вы не передаете важную информацию, например, о том, какие именно ошибки вы видите.

#pragma comment(lib, "WindowsApp")

#include <winrt/Windows.ApplicationModel.h>
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.Storage.h>
#include <winrt/Windows.Storage.Search.h>

using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Storage;
using namespace Windows::Storage::Search;

IAsyncAction LoadFiles()
{
    StorageFolder appFolder = Windows::ApplicationModel::Package::Current().InstalledLocation();
    StorageFolder assetsFolder = co_await appFolder.GetFolderAsync(L"Assets");
    auto files = co_await assetsFolder.GetFilesAsync(CommonFileQuery::DefaultQuery);
}

int main()
{
    LoadFiles().get();
}
Другие вопросы по тегам