0

在 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 项目设置是否存在一些基本问题?

4

1 回答 1

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。感谢所有提出建议的人。

于 2018-10-28T23:55:30.873 回答