如何在C ++ / winrt中调用StorageFile.OpenReadAsync?

时间:2018-11-19 05:48:33

标签: c++-winrt win2d

在我继续努力以C ++ / winrt加载.svg文件集合的过程中,我遇到了一个神秘的链接错误。我想尝试使用CanvasSvgDocument.ReadAsync(resourceCreator,filestream)。要到达那里,首先必须从StorageFile获取流,这似乎是实现该方法的方式(在此示例中已经加载了nextFile,一个StorageFile)。当然,这是在定义为IAsyncAction的方法中。我将从文件顶部列出#includes和名称空间。

#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 "winrt/Windows.UI.Xaml.Media.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;

这是有问题的电话:

IRandomAccessStreamWithContentType fileStream = co_await nextFile.OpenReadAsync();

这会产生一个链接错误,我将在下面进行介绍。我是否尝试fileStream结果的全限定名都没关系:

winrt :: Windows :: Storage :: Streams :: IRandomAccessStreamWithContentType fileStream = co_await nextFile.OpenReadAsync();

无论哪种方式,我都会得到此链接错误:

  

错误LNK2019无法解析的外部符号“ public:struct   winrt :: Windows :: Foundation :: IAsyncOperation   __thiscall winrt :: impl :: consume_Windows_Storage_Streams_IRandomAccessStreamReference :: OpenReadAsync(void)const“   (?OpenReadAsync @?$ consume_Windows_Storage_Streams_IRandomAccessStreamReference @ UIStorageFile @ Storage @ Windows @ winrt @@@ impl @ winrt @@ QBE?AU?$ IAsyncOperation @ UIRandomAccessStreamWithContentType @ Streams @ Storage @ Windows @ winrt @@@ Foundation @ Windows @ 3 @ XZ)   在函数“ public:struct中引用”   winrt :: Windows :: Foundation :: IAsyncAction __thiscall   AppEngine :: ResourceManager :: LoadSvgResources $ _ResumeCoro $ 2(struct   winrt :: Microsoft :: Graphics :: Canvas :: UI :: Xaml :: CanvasControl)“   (?LoadSvgResources $ _ResumeCoro $ 2 @ ResourceManager @ AppEngine @@ QAE?AUIAsyncAction @ Foundation @ Windows @ winrt @@ UCanvasControl @ Xaml @ UI @ Canvas @ Graphics @ Microsoft @ 6 @@ Z)

我也尝试过使用auto作为结果类型,没有运气。在C ++ / winrt中使用OpenReadAsync()获取流的正确方法是什么?

1 个答案:

答案 0 :(得分:1)

您显然在启用precompiled headers的情况下进行编译(由#include "pch.h"指令暗示)。这样做时,用于生成预编译头文件的头文件必须包含在使用它的编译单元中的第一条非空,非注释行上。

/Yu (Use Precompiled Header File)文档具有相关信息:

  

编译器将.h文件之前的所有代码视为已预编译。它会跳到与.h文件关联的#include指令之外,使用.pch文件中包含的代码,然后编译filename之后的所有代码。

换句话说,您在#include "pch.h"指令之前的所有include都将被忽略。由于C ++ / WinRT是仅标头的库,因此最终将导致链接器错误。

要解决此问题

  • #include "pch.h"指令移动到文件的最上方,或者
  • 在相关编译单元上用/FI (Name Forced Include File)编译器选项替换#include指令,或者
  • 禁用预编译头文件。