如何在最新的cppwinrt中co_await GetFilesAsync?

时间:2018-10-24 22:25:19

标签: visual-studio uwp c++-winrt

以前,在cppwinrt人员的帮助下,我设法枚举了StorageFolder中的文件;当时我没有必要的#include。在我重新构建应用程序之前,一切正常,直到我以Visual Studio 15.9.0 Preview 3现在提供的BlankApp作为模板C ++ / WinRT应用程序作为起点为止。现在,相同的代码产生了我无法逾越的链接错误。让我引述令人反感的行:这是我称为ResourceManager的类的一部分;它包含对以这种方式定义的文件夹的引用:

IVectorView<StorageFile> m_activity_files = nullptr;

然后该类具有一个方法,声明为

IAsyncAction LoadActivities();

co_awa调用一个调用以获取适当的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和名称空间与以前相同,并且在参数中是否使用完全限定的名称似乎无关紧要。

#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的用法,但是仅解决一下就足够了!

[UPDATE]当此调用位于返回类型为IAsyncAction的方法中时,链接错误是否指向IAsyncOperation有意义?

[更新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 :(得分:0)

好的,这就是我所做的,并且有效。首先,我放弃了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晚。感谢所有提出建议的人。