중요합니다
C++/WinRT 확장(VSIX) 및 NuGet 패키지(프로젝트 템플릿 및 빌드 지원을 함께 제공)를 설치 및 사용하는 등 C++/Win Visual Studio RT 개발을 위한 Visual Studio 설정하는 방법에 대한 자세한 내용은 C++/WinRT에 대한 Visual Studio 지원을 참조하세요.
C++/WinRT를 사용하여 속도를 높이기 위해 이 항목에서는 새로운 Windows 콘솔 애플리케이션(C++/WinRT) 프로젝트를 기반으로 하는 간단한 코드 예제를 안내합니다. 이 항목에서는 Windows Desktop 애플리케이션 프로젝트에 C++/WinRT 지원을 추가하는 방법도 보여줍니다.
메모
Visual Studio 2017(버전 15.8.0 이상)을 사용하고 Windows SDK 버전 10.0.17134.0(Windows 10을 대상으로 하는 경우 최신 버전의 Visual Studio 및 Windows SDK를 사용하여 개발하는 것이 좋습니다., 버전 1803) 새로 만든 C++/WinRT 프로젝트는 "오류 C3861: 'from_abi': 식별자를 찾을 수 없음" 오류와 base.h에서 발생하는 다른 오류로 인해 컴파일하지 못할 수 있습니다. 해결 방법은 Windows SDK의 이후 버전(표준을 더 잘 준수하는 버전)을 대상으로 하거나, 프로젝트 속성 C/C++>언어>규칙 준수 모드: 아니요로 설정하는 것입니다(또한 /permissive-가 프로젝트 속성 C/C++>언어>명령줄의 추가 옵션 아래에 표시되면 해당 옵션을 삭제하세요).
C++/WinRT 빠른 시작
새 Windows 콘솔 애플리케이션(C++/WinRT) 프로젝트를 만듭니다.
pch.h 및 main.cpp을 다음과 같이 편집하세요.
// pch.h
#pragma once
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.Web.Syndication.h>
#include <iostream>
// main.cpp
#include "pch.h"
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Web::Syndication;
int main()
{
winrt::init_apartment();
Uri rssFeedUri{ L"https://blogs.windows.com/feed" };
SyndicationClient syndicationClient;
syndicationClient.SetRequestHeader(L"User-Agent", L"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; WOW64; Trident/6.0)");
SyndicationFeed syndicationFeed = syndicationClient.RetrieveFeedAsync(rssFeedUri).get();
for (const SyndicationItem syndicationItem : syndicationFeed.Items())
{
winrt::hstring titleAsHstring = syndicationItem.Title().Text();
// A workaround to remove the trademark symbol from the title string, because it causes issues in this case.
std::wstring titleAsStdWstring{ titleAsHstring.c_str() };
titleAsStdWstring.erase(remove(titleAsStdWstring.begin(), titleAsStdWstring.end(), L'™'), titleAsStdWstring.end());
titleAsHstring = titleAsStdWstring;
std::wcout << titleAsHstring.c_str() << std::endl;
}
}
위의 간단한 코드 예제를 한 조각씩 살펴보겠습니다. 각 부분에서 어떤 일이 일어나고 있는지 설명해 보겠습니다.
#include <winrt/Windows.Foundation.Collections.h>
#include <winrt/Windows.Web.Syndication.h>
기본 프로젝트 설정을 사용하면 포함된 헤더는 폴더 %WindowsSdkDir%Include<WindowsTargetPlatformVersion>\cppwinrt\winrt내의 Windows SDK에서 가져옵니다. Visual Studio IncludePath 매크로에 해당 경로를 포함합니다. 그러나 Windows SDK에 대한 엄격한 종속성은 없습니다. 프로젝트(도구를 통해cppwinrt.exe)가 프로젝트의 $(GeneratedFilesDir) 폴더에 동일한 헤더를 생성하기 때문입니다. 다른 곳에서 찾을 수 없거나 프로젝트 설정을 변경하는 경우 해당 폴더에서 로드됩니다.
헤더에는 C++/WinRT로 프로젝션된 Windows API가 포함됩니다. 즉, 각 Windows 형식에 대해 C++/WinRT는 C++친화적인 동등한 형식(프로젝션된 형식이라고 함)을 정의합니다. 프로젝션된 형식은 Windows 형식과 정규화된 이름이 동일하지만 C++ winrt 네임스페이스에 배치됩니다. 이러한 포함을 미리 컴파일된 헤더에 배치하면 증분 빌드 시간이 줄어듭니다.
중요합니다
Windows 네임스페이스의 형식을 사용하려면 위와 같이 해당 C++/WinRT Windows 네임스페이스 헤더 파일을 사용해야 합니다#include.
해당 헤더는 형식의 네임스페이스와 이름이 같은 헤더입니다. 예를 들어 Windows::Foundation::Collections::P ropertySet 런타임 클래스에 C++/WinRT 프로젝션을 사용하려면 헤더를 winrt/Windows.Foundation.Collections.h 포함합니다.
C++/WinRT 프로젝션 헤더는 관련 네임스페이스 헤더 파일을 자동으로 포함하는 것이 일반적입니다. 예를 들어, winrt/Windows.Foundation.Collections.h에는 winrt/Windows.Foundation.h이 포함됩니다. 그러나 시간이 지남에 따라 변경되는 구현 세부 정보이므로 이 동작에 의존해서는 안 됩니다. 필요한 헤더를 명시적으로 포함해야 합니다.
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Web::Syndication;
using namespace 지시문은 선택 사항이지만 편리합니다. 이러한 지시문에 대해 위에 표시된 패턴( winrt 네임스페이스의 모든 항목에 대해 정규화되지 않은 이름 조회 허용)은 새 프로젝트를 시작할 때 적합하며 C++/WinRT는 해당 프로젝트 내에서 사용하는 유일한 언어 프로젝션입니다. 반면, C++/WinRT 코드를 C++/CX 및/또는 SDK 애플리케이션 이진 인터페이스(ABI) 코드와 함께 사용하고 있다면(즉, 이러한 모델 중 하나 또는 둘 모두에서 이식 중이거나, 이들과 상호 운용하는 경우), C++/WinRT와 C++/CX 간 상호 운용, C++/CX에서 C++/WinRT로 이동, C++/WinRT와 ABI 간 상호 운용 항목을 참조하세요.
winrt::init_apartment();
winrt::init_apartment 호출은 기본적으로 다중 스레드 아파트에서 Windows 런타임 스레드를 초기화합니다. 또한 이 호출은 COM을 초기화합니다.
Uri rssFeedUri{ L"https://blogs.windows.com/feed" };
SyndicationClient syndicationClient;
두 개체를 스택 할당합니다. 이 개체는 Windows 블로그의 URI와 배포 클라이언트를 나타냅니다. 간단한 와이드 문자열 리터럴을 사용하여 URI를 생성합니다(문자열을 사용할 수 있는 더 많은 방법은 C++/WinRT 의 문자열 처리 참조).
SyndicationFeed syndicationFeed = syndicationClient.RetrieveFeedAsync(rssFeedUri).get();
SyndicationClient::RetrieveFeedAsync는 비동기 Windows 런타임 함수의 예입니다. 코드 예제는 RetrieveFeedAsync에서 비동기 작업 개체를 수신하고 호출 스레드를 차단하고 결과(이 경우 배포 피드)를 기다리는 해당 개체에 대한 가져오기 를 호출합니다. 동시성 및 비차단 기술에 대한 자세한 내용은 C++/WinRT를 사용한 동시성 및 비동기 작업을 참조하세요.
for (const SyndicationItem syndicationItem : syndicationFeed.Items()) { ... }
SyndicationFeed.Items 는 시작 및 끝 함수에서 반환된 반복기(또는 상수, 역방향 및 상수 역방향 변형)에 의해 정의된 범위입니다. 따라서 범위 기반 문이나 for 템플릿 함수를 사용하여 항목을 열거할 수 있습니다. 이와 같이 Windows 런타임 컬렉션을 반복할 때마다 #include <winrt/Windows.Foundation.Collections.h>해야 합니다.
winrt::hstring titleAsHstring = syndicationItem.Title().Text();
// Omitted: there's a little bit of extra work here to remove the trademark symbol from the title text.
std::wcout << titleAsHstring.c_str() << std::endl;
피드의 제목 텍스트를 winrt::hstring 개체로 가져옵니다( C++/WinRT의 String 처리에 대한 자세한 내용). 그런 다음 hstring 은 C++ 표준 라이브러리 문자열에 사용되는 패턴을 반영하는 c_str 함수를 통해 출력됩니다.
보듯이 C++/WinRT는 다음과 같은 syndicationItem.Title().Text()최신 및 클래스와 유사한 C++ 식을 권장합니다. 기존 COM 프로그래밍과는 다른 보다 깔끔한 프로그래밍 스타일입니다. COM을 직접 초기화하거나 COM 포인터를 사용할 필요가 없습니다.
HRESULT 반환 코드를 처리할 필요도 없습니다. C++/WinRT는 오류 HRESULT를 자연스럽고 최신 프로그래밍 스타일에 대한 winrt::hresult-error 와 같은 예외로 변환합니다. 오류 처리 및 코드 예제에 대한 자세한 내용은 C++/WinRT를 사용한 오류 처리를 참조하세요.
C++/WinRT 지원을 추가하도록 Windows Desktop 애플리케이션 프로젝트 수정
일부 데스크톱 프로젝트(예: Visual Studio WinUI 3 템플릿)에는 C++/WinRT 지원이 기본 제공됩니다.
그러나 이 섹션에서는 C++/WinRT 지원을 사용할 수 있는 Windows Desktop 애플리케이션 프로젝트에 추가하는 방법을 보여줍니다. 기존 Windows Desktop 애플리케이션 프로젝트가 없는 경우 먼저 프로젝트를 만들어 이러한 단계를 따를 수 있습니다. 예를 들어 Visual Studio 열고 Visual C++>Windows Desktop>Windows 데스크톱 애플리케이션 프로젝트를 만듭니다.
필요에 따라 C++/WinRT Visual Studio 확장(VSIX) 및 NuGet 패키지를 설치할 수 있습니다. 자세한 내용은 C++/WinRT에 대한 Visual Studio 지원을 참조하세요.
프로젝트 속성 설정
프로젝트 속성 일반>Windows SDK 버전으로 이동하고 모든 구성 및 모든 플랫폼을 선택합니다. Windows SDK 버전이 10.0.17134.0(Windows 10, 버전 1803) 이상으로 설정되어 있는지 확인합니다.
새 프로젝트가 컴파일되지 않는 이유는 무엇인가요?의 영향을 받지 않는지 확인합니다.
C++/WinRT는 C++17 표준의 기능을 사용하므로 프로젝트 속성 C/C++>언어>C++ 언어 표준을ISO C++17 표준(/std:c++17)으로 설정합니다.
미리 컴파일된 헤더
기본 프로젝트 템플릿은 미리 컴파일된 헤더를 만듭니다( 이름 framework.h또는 stdafx.h.). 이름을 .로 pch.h바꿉니다. 파일이 있는 stdafx.cpp 경우 이름을 .로 pch.cpp바꿉니다. 프로젝트 속성 C/C++>미리 컴파일된 헤더> 미리컴파일된 헤더를 만들기(/Yc)로 설정하고 미리 컴파일된 헤더 파일을pch.h로 설정합니다.
모든 #include "framework.h"(또는 #include "stdafx.h")을(를) #include "pch.h"(으)로 찾아 바꾸세요.
pch.h에 winrt/base.h을 포함합니다.
// pch.h
...
#include <winrt/base.h>
연결하기
C++/WinRT 언어 프로젝션은 WindowsApp.lib 우산 라이브러리에 연결해야 하는 특정 Windows 런타임 무료(비 멤버) 함수 및 진입점에 따라 달라집니다. 이 섹션에서는 링커를 만족시키는 세 가지 방법을 설명합니다.
첫 번째 옵션은 모든 C++/WinRT MSBuild 속성 및 대상을 Visual Studio 프로젝트에 추가하는 것입니다. 이렇게 하려면 Microsoft.Windows.CppWinRT NuGet 패키지를 프로젝트에 설치합니다. Visual Studio에서 프로젝트를 열고 Project>NuGet 패키지 관리...>찾아보기를 클릭한 다음, 검색 상자에 Microsoft.Windows.CppWinRT를 입력하거나 붙여넣고, 검색 결과에서 항목을 선택한 후 설치를 클릭하여 해당 프로젝트에 대한 패키지를 설치합니다.
프로젝트 링크 설정을 사용하여 WindowsApp.lib를 명시적으로 연결할 수도 있습니다. 또는 다음과 같이 소스 코드(예: pch.h)에서 수행할 수 있습니다.
#pragma comment(lib, "windowsapp")
이제 C++/WinRT 코드를 컴파일하고 연결하고 프로젝트에 추가할 수 있습니다(예: 위의 A C++/WinRT 빠른 시작 섹션에 표시된 것과 유사한 코드).
C++/WinRT에 대한 세 가지 주요 시나리오
C++/WinRT를 사용하고 익숙해지고 여기에 있는 설명서의 나머지 부분을 통해 작업할 때 다음 섹션에 설명된 대로 세 가지 주요 시나리오가 있음을 알 수 있습니다.
Windows API 및 형식 사용하기
즉, API를 사용하거나 호출 합니다. 예를 들어 Bluetooth를 사용해 통신하거나, 비디오를 스트리밍하고 표시하거나, Windows 셸과 통합하는 등의 작업을 위해 API를 호출하는 경우입니다. C++/WinRT는 이 시나리오 범주를 완전하고 타협하지 않게 지원합니다. 자세한 내용은 C++/WinRT를 사용하여 API 사용을 참조하세요.
Windows API 및 형식 작성
즉, API 및 형식 을 생성 합니다. 예를 들어 위의 섹션에 설명된 API 종류를 생성합니다. 또는 그래픽 API; 스토리지 및 파일 시스템 API; 네트워킹 API 등 자세한 내용은 C++/WinRT를 사용하여 작성자 API를 참조하세요.
C++/WinRT를 사용하여 API를 작성하는 것은 IDL을 사용하여 API의 모양을 정의해야 구현할 수 있기 때문에 API를 사용하는 것보다 약간 더 복잡합니다. XAML 컨트롤: C++/WinRT 속성에 바인딩에 이 작업을 수행하는 방법에 대한 단계별 안내가 있습니다.
XAML 애플리케이션
이 시나리오는 XAML UI 프레임워크에서 애플리케이션 및 컨트롤을 빌드하는 것입니다. XAML 애플리케이션에서 작업하는 것은 사용 및 작성의 조합에 해당합니다. 그러나 XAML은 오늘날 Windows 주요 UI 프레임워크이며 Windows 런타임 대한 영향력이 그에 비례하기 때문에 고유한 시나리오 범주를 사용할 자격이 있습니다.
XAML은 리플렉션을 제공하는 프로그래밍 언어에 가장 적합합니다. C++/WinRT에서는 XAML 프레임워크와 상호 운용하기 위해 약간의 추가 작업을 수행해야 하는 경우가 있습니다. 이러한 모든 사례는 설명서에서 다룹니다. 시작하기에 좋은 항목은 XAML 컨트롤: C++/WinRT 속성에 바인딩 및 C++/WinRT를 사용한 XAML 사용자 지정(템플릿) 컨트롤입니다.
C++/WinRT로 작성된 샘플 앱
C++/WinRT 샘플 앱은 어디에서 찾을 수 있나요?를 참조하세요.
중요 API
- SyndicationClient::RetrieveFeedAsync 메서드
- SyndicationFeed.Items 속성
- winrt::hstring 구조체
- winrt::hresult-error 구조체
관련 항목
Windows developer