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