【问题标题】:How to co_await GetFilesAsync in latest cppwinrt?如何在最新的 cppwinrt 中 co_await GetFilesAsync?
【发布时间】:2018-10-29 07:55:30
【问题描述】:

在 cppwinrt 人员的帮助下,我之前设法枚举了 StorageFolder 中的文件;当时我缺少所需的#include。工作正常,直到我使用 Visual Studio 15.9.0 Preview 3 现在提供的 BlankApp 作为模板 C++/WinRT 应用程序作为起点重建应用程序。现在,相同的代码会产生一个我无法通过的链接错误。让我引用有问题的行:这是我称为 ResourceManager 的类的一部分;它包含对以这种方式定义的文件夹的引用:

IVectorView<StorageFile> m_activity_files = nullptr;

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

IAsyncAction LoadActivities();

其中 co_await 调用以获取适当的 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 的使用,但现在仅仅解决这个问题就足够了!

[更新] 当此调用在返回类型为 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 已经#included,并且它的命名空间声明如上。但现在我在 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 项目设置是否存在一些基本问题?

【问题讨论】:

  • 感谢您的回复,汉斯。但是,如果我针对下一个可用版本 17133,Canvas 将无法工作。如果我将目标设置为 17166 并将最小值设置为 17133,则主 .h 文件中存在静态断言错误(永远不了解程序如何以版本为目标,除非这也是最低版本)。也许我必须等待修复。
  • 请查看document
  • 谢谢,CoCalceDew,但是虽然文档有一些有用的信息,但我仍然无法解释为什么对 GetFilesAsync 的调用用于构建而不再如此。还是被这里难住了。
  • 不相关,但我会考虑使用与ResourceManager 不同的名称,因为它也是您可能希望用于管理资源的 Windows 类型(例如针对不同比例因子具有多种分辨率的本地化字符串或图像) .
  • 谢谢彼得。我自己的 ResourceManager 位于单独的命名空间中,但最好还是让它更加独特。

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


【解决方案1】:

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

【讨论】:

  • 我应该补充一点,我现在通过创建一个新模板并添加回该项目中的文件来重新定位到 17763 - 仅使用重新定位命令并不能完全完成这项工作。好消息是,现在 GetFolderAsync() 和 GetFilesAsync() 可以正常工作,唯一的例外是我不能在后者中使用 CommonFileQuery 参数,这可能是我的错,但其他调用现在可以正常工作。显然需要更新的系统。
猜你喜欢
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-28
相关资源
最近更新 更多