VS 2017 и 2019 не удается найти заголовочные файлы WinRT даже в новом решении

#c #winapi #uwp #include #c -winrt

#c #winapi #uwp #включить #c -winrt

Вопрос:

Итак, я пытаюсь обновить приложение Win32 до UWP, используя «Проект упаковки приложений Windows», я сталкиваюсь с проблемами файловой системы, которые я ожидал, и пытаюсь их решить. Для этого мне нужен доступ к библиотекам WinRT, чтобы я мог работать с путями UWP, чтобы получить доступ к своим ресурсам и ресурсам.

Я установил расширение C / WinRT VSIX и добавил пакет NuGet в свое решение. Я предполагал, что из того, что я прочитал, это все, что мне нужно было сделать, чтобы получить доступ к заголовочным файлам. Однако компилятор, по-видимому, не может найти заголовочные файлы для WinRT и его пространств имен, поскольку я получаю сообщения, cannot open source file "winrt/Windows.Storage.h и я не могу использовать Windows::Storage::StorageFolder вызовы, которые мне, по-видимому, нужны для работы кода моей файловой системы. Несмотря на все мои усилия определить, какие пути включения мне не хватает, ничего не сработало, поэтому я попробовал другую тактику.

В том же решении я создал «приложение DirectX 12 (универсальная Windows)», думая, что, возможно, я пошел по неверному пути, и решил посмотреть, смогу ли я повторно реализовать свой интерфейс как прямое приложение UWP без устаревшего win32. Похоже, что этот новый проект имеет правильные включения, поскольку using директивы работают для Windows.* пространств имен, которые он использует, и он компилируется. Несмотря на это, я не могу понять, что он делает, чтобы получить доступ к пространствам имен, аналогичным тем, которые мне нужны, поэтому я не могу перепроектировать его, чтобы заставить мой оригинальный проект работать. Однако я скептически отношусь к тому, что при этом используются одни и те же библиотеки, поскольку этот тип проекта был доступен еще до того, как я установил расширение C / WinRT VSIX, и WinRT нигде не упоминается.

Чтобы вернуться к основам, я создал новое решение с «настольным приложением Windows (C / WinRT)», поскольку я знаю, что для этого используется среда выполнения, которую я ищу, и она должна быть чистой (в отличие от моего давно используемого решения с множеством проектов и конфигураций), поэтому яможете увидеть параметры, которые он использует для репликации, и получить доступ к нужным мне инструментам. Однако недавно созданный проект не будет компилироваться, и в нем указана точно та же причина, что и в моем оригинальном решении и проекте, о невозможности найти заголовки WinRT. Это сбило меня с толку, поэтому я предположил, что это была какая-то другая конфигурация, которую я сделал глобально для VS2017.

Чтобы изолировать это, я установил VS2019 и добавил к нему расширение, подумав: «новая среда, никаких сбоев в конфигурации». Но опять же, недавно созданный проект «Windows Desktop Application (C / WinRT)» не будет создан и не сможет найти заголовочные файлы.

Автоматически созданный pch.h содержит следующее

 //it can't find anything starting with "winrt/"
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.System.h>
#include <winrt/Windows.UI.Xaml.h>
#include <winrt/Windows.UI.Xaml.Controls.h>
#include <winrt/Windows.UI.Xaml.Hosting.h>
#include <winrt/Windows.UI.Xaml.Media.h>
//but it finds this one totally fine
#include <Windows.UI.Xaml.Hosting.DesktopWindowXamlSource.h>
  

Так что это происходит как в старых, так и в новых файлах решений, а также в VS2017 и VS2019. Я официально озадачен тем, что происходит.

Может ли кто-нибудь пролить свет на то, чего мне не хватает, чтобы я мог получить либо свое приложение win32, либо свежесозданный проект WinRT для сборки?

Комментарии:

1. У вас где-нибудь установлен Windows SDK? Например, на моем КОМПЬЮТЕРЕ все файлы заголовков WinRT находятся в C:Program Files (x86)Windows Kits10Include10.0.19041.0winrt (10.0.19041.0 — последняя версия SDK), и Visual Studio использует это.

2. @SimonMourier да, но почему это не включено по умолчанию в новый проект? Я бы предположил, что таргетинг проекта позаботится о таких вещах, и новый проект должен быть готов к сборке с самого начала. Мне никогда не приходилось вручную добавлять Windows SDK к пути включения, поэтому это различие сбивает меня с толку.

3. Вам не нужен Windows SDK для компиляции приложения C / WinRT. Вам нужно запустить генератор кода (cppwinrt.exe ) как часть вашей сборки. Шаблоны проектов в VSIX правильно настроили это для вас. Попытка адаптировать его к существующему проекту Visual Studio довольно сложна.

4. @IInspectable это может быть то, чего мне не хватает. Однако я немного смущен. Если предполагается, что генератор кода должен запускаться при сборке с шаблонами, я не понимаю, почему он не создает «свежий из коробки», как это было. Но вы дали мне новую линию расследования. Я сообщу об этом.

5. Предполагается, что чистый проект на основе C / WinRT должен быть готовым к сборке. Можете ли вы проверить, получаете ли вы сгенерированную папку Files в вашем дереве исходных текстов? Именно туда генератор кода помещает заголовочные (и исходные) файлы. Кроме того, какую версию VSIX вы используете?

Ответ №1:

это было исправлено https://github.com/microsoft/cppwinrt/pull/781 Обновите свои пакеты MSIX и NuGet

Ответ №2:

вы должны добавить ссылку на windows .winmd, установленный где-нибудь

C:Program Файлы (x86) Windows Kits10 UnionMetadata Windows.winmd

или где-нибудь в каталоге vs, просмотрев затем справочное окно

вы можете использовать «использование Windows.Хранилище», которое будет включать в себя необходимую вещь, я не уверен, но у меня есть приложение winform, в котором я использовал это, и оно отлично работало, так что, возможно, вы сможете попробовать

Комментарии:

1. Вам не нужно добавлять ссылку на системные файлы .winmd. Они находятся в стандартных местах, и система сборки автоматически обнаружит их. Это справедливо и для библиотек, импортированных через NuGer.

2. На самом деле, это правильный ответ из-за этой проблемы github.com/microsoft/cppwinrt/issues/780

3. using Windows.Storage недопустимый C . Я не уверен, как вы бы оправдали это как «правильное» .

4. @IInspectable верно, но это не важная часть (я думаю, что это просто опечатка). Важной частью является «добавление зависимости вручную в Windows.winmd», потому что основная проблема заключается в том, что компилятор не может найти заголовок, потому что они не были сгенерированы из-за отсутствия зависимости.

Ответ №3:

Я получил то же сообщение об ошибке, которое я решил, добавив

%WindowsSdkDir%Включить WindowsTargetPlatformVersion cppwinrt в путь включения или путем создания решения только с помощью операторов include, которые также генерируют заголовки и заставляют работать пространство имен winrt.

%WindowsSdkDir% можно получить, открыв командную строку разработчика в меню tools, command line и набрав echo %WindowsSdkDir%,

windowsTargetPlatformVersion можно скопировать из свойств конфигурации — версия Windows SDK

Это объясняется по этой ссылке

https://learn.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/get-started#important-apis