首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在最新的cppwinrt中co_await GetFilesAsync?

如何在最新的cppwinrt中co_await GetFilesAsync?
EN

Stack Overflow用户
提问于 2018-10-25 06:25:19
回答 1查看 317关注 0票数 0

在cppwinrt人员的帮助下,我以前设法枚举了StorageFolder中的文件;当时我缺少所需的#include。在我使用Visual Studio15.9.0Preview3提供的BlankApp作为模板C++/WinRT应用程序重新构建应用程序之前,它一直运行得很好。现在,相同的代码产生了一个我无法克服的链接错误。让我引用令人不快的一行:这是我称为ResourceManager的类的一部分;它包含对以这种方式定义的文件夹的引用:

代码语言:javascript
复制
IVectorView<StorageFile> m_activity_files = nullptr;

然后这个类就有了一个方法,声明为

代码语言:javascript
复制
IAsyncAction LoadActivities();

它co_awaits一个调用,以m_activities_folder的形式获取适当的StorageFolder,一旦完成,就会尝试枚举文件夹内容:

代码语言:javascript
复制
m_activity_files = co_await m_activities_folder.GetFilesAsync(CommonFileQuery::DefaultQuery);

这就是问题所在。以前正常工作的东西现在会产生以下链接错误:

代码语言:javascript
复制
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)

(后跟目标文件的路径)包含和名称空间与以前相同,而且在参数中是否使用完全限定名似乎并不重要。

代码语言:javascript
复制
#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会更好。所以:

代码语言:javascript
复制
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已经包含在#included中,其名称空间声明如下。但是现在我在QueryOptions上得到了一个额外的链接错误:

代码语言:javascript
复制
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项目设置会有一些基本问题吗?

EN

回答 1

Stack Overflow用户

发布于 2018-10-29 07:55:31

好了,这就是我所做的,并且它起作用了。首先,我放弃了使用CommonFileQuery。而不是

代码语言:javascript
复制
m_activity_files = co_await m_activities_folder.GetFilesAsync(winrt::Windows::Storage::Search::CommonFileQuery::DefaultQuery);

相反,我只是简单地使用

代码语言:javascript
复制
m_activity_files = co_await activitiesFolder.GetFilesAsync();

这就是它的构建。然后我发现使用StorageFolder的方法获取内部文件夹崩溃了,所以我现在使用它的路径获取所需的文件夹:

代码语言:javascript
复制
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更高。感谢所有提出建议的人。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52978738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档