【发布时间】: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