Как вызвать StorageFile.OpenReadAsync в C ++ / winrt? - PullRequest
0 голосов
/ 19 ноября 2018

В моих постоянных попытках загрузить коллекцию файлов .svg в C ++ / winrt я столкнулся с загадочной ошибкой ссылки.Я хотел бы попробовать использовать CanvasSvgDocument.ReadAsync (resourceCreator, filestream).Чтобы добраться туда, сначала необходимо получить поток из StorageFile, и это, по-видимому, является способом сделать это (nextFile, StorageFile, уже загружен в этом примере).Это, конечно, внутри метода, определенного как IAsyncAction.Я перечислю #include и пространства имен в верхней части файла.

#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 :: потребление_Windows_Storage_Streams_IRandomAccessStreamReference :: OpenReadAsync(void) const "(? OpenReadAsync @? $ потребление_Windows_Storage_Streams_IRandomAccessStreamReference @ UIStorageFile @ Storage @ Windows @ winrt @@@ impl @ winrt @@ QBE? AU? $ IAsyncOperation @ UIRandomAccessStreamWithConsttt@ 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) * ​​1014 *

Я также пытался использовать auto кактип результата, не повезло.Как правильно получить поток, используя OpenReadAsync () в C ++ / winrt?

1 Ответ

0 голосов
/ 19 ноября 2018

Вы, вероятно, компилируете с включенными предварительно скомпилированными заголовками (на что указывает директива #include "pch.h"). При этом заголовок, используемый для генерации предварительно скомпилированного заголовка , должен быть включен в первую непустую строку без комментариев в модуле компиляции, который его использует.

Документация / Yu (Использовать предварительно скомпилированный заголовочный файл) содержит соответствующую информацию:

Компилятор рассматривает весь код перед файлом .h как скомпилированный. Он пропускает чуть дальше директивы #include, связанной с файлом .h, использует код, содержащийся в файле .pch, а затем компилирует весь код после filename.

Другими словами, все ваши включения, предшествующие директиве #include "pch.h", игнорируются. Поскольку C ++ / WinRT является библиотекой только для заголовков, это в конечном итоге приведет к ошибкам компоновщика.

Чтобы исправить проблему

  • Переместите директиву #include "pch.h" в самый верх файла или
  • Замените директиву #include на параметр компилятора / FI (Name Forced Include File) на соответствующих блоках компиляции или
  • Отключить использование предварительно скомпилированных заголовков.
...