중요합니다
C++/WinRT VsIX(WinRT Visual Studio 확장) 및 NuGet 패키지(프로젝트 템플릿 및 빌드 지원을 함께 제공)를 설치 및 사용하는 등 C++/WinRT 개발을 위한 Visual Studio를 설정하는 방법에 대한 자세한 내용은 C++/WinRT대한 visual Studio 지원
C++/WinRT사용하여 속도를 높이기 위해 이 항목에서는 새로운 Windows 콘솔 애플리케이션(C++/WinRT) 프로젝트를 기반으로 하는 간단한 코드 예제를 안내합니다. 이 주제에서는 Windows 데스크톱 애플리케이션 프로젝트에 C++/WinRT 지원을
비고
최신 버전의 Visual Studio 및 Windows SDK를 사용하여 개발하는 것이 좋습니다. Visual Studio 2017(버전 15.8.0 이상)을 사용하고 Windows SDK 버전 10.0.17134.0(Windows 10, 버전 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>
기본 프로젝트 설정을 사용하면 포함된 헤더는 Windows SDK에서 %WindowsSdkDir%Include<WindowsTargetPlatformVersion>\cppwinrt\winrt
폴더 내에서 제공됩니다. Visual Studio는 해당 경로를 IncludePath 매크로에 포함합니다. 그러나 프로젝트(cppwinrt.exe
도구를 통해)가 프로젝트의 $(GeneratedFilesDir) 폴더에 동일한 헤더를 생성하기 때문에 Windows SDK에 대한 엄격한 종속성은 없습니다. 다른 곳에서 찾을 수 없거나 프로젝트 설정을 변경하는 경우 해당 폴더에서 로드됩니다.
헤더에는 C++/WinRT로 프로젝션된 Windows API가 포함됩니다. 즉, 각 Windows 형식에 대해 C++/WinRT는 C++에 적합한 해당 형식(이른바
중요합니다
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 코드를
winrt::init_apartment();
winrt::init_apartment
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비동기 작업 개체를 수신하며, 호출 스레드를 차단하고 결과(이 경우에는 배포 피드)를 기다리기 위해 해당 개체에서 get 메서드를 호출합니다. 동시성에 대한 자세한 내용과 비차단 기술에 대해서는 C++/WinRT 동시성 및 비동기 작업을 참조하세요.
for (const SyndicationItem syndicationItem : syndicationFeed.Items()) { ... }
SyndicationFeed.Items은(는) begin과(와) end 함수(또는 상수, 역방향 및 상수 역방향 변형)에서 반환된 반복기에 의해 정의된 범위입니다. 이로 인해 범위 기반 문장이나 for
템플릿 함수를 사용하여 Items을 열거할 수 있습니다. 이와 같이 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;
피드의 제목 텍스트를
보듯이 C++/WinRT는 syndicationItem.Title().Text()
같은 최신 및 클래스와 유사한 C++ 식을 권장합니다. 기존 COM 프로그래밍과는 다른 보다 깔끔한 프로그래밍 스타일입니다. COM을 직접 초기화하거나 COM 포인터를 사용할 필요가 없습니다.
HRESULT 반환 코드를 처리할 필요도 없습니다. C++/WinRT는 자연스럽고 현대적인 프로그래밍 스타일을 위해 오류 HRESULT를 winrt::hresult-error 같은 예외로 변환합니다. 오류 처리 및 코드 예제에 대한 더 많은 정보는 C++/WinRT에서의 오류 처리을 참조하세요.
C++/WinRT 지원을 추가하도록 Windows 데스크톱 애플리케이션 프로젝트 수정
일부 데스크톱 프로젝트(예: Visual Studio
그러나 이 섹션에서는 C++/WinRT 지원을 사용할 수 있는 모든 Windows 데스크톱 애플리케이션 프로젝트에 추가하는 방법을 보여 줍니다. 기존 Windows Desktop 애플리케이션 프로젝트가 없는 경우 먼저 프로젝트를 만들어 이러한 단계를 따를 수 있습니다. 예를 들어 Visual Studio를 열고 Visual C++>Windows Desktop>Windows 데스크톱 애플리케이션 프로젝트를 만듭니다.
필요에 따라 C++/WinRT VSIX(Visual Studio 확장) 및 NuGet 패키지를 설치할 수 있습니다. 자세한 내용은 C++/WinRT대한
프로젝트 속성 설정
프로젝트 속성 일반>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
로 변경하세요. 프로젝트 속성
모든 #include "framework.h"
(또는 #include "stdafx.h"
)를 찾아서 #include "pch.h"
로 바꾸세요.
pch.h
에 winrt/base.h
를 포함합니다.
// pch.h
...
#include <winrt/base.h>
연결하기
C++/WinRT 언어 프로젝션은 특정 Windows 런타임 비회원(비멤버) 함수 및 진입점에 따라 달라지며, 이는 WindowsApp.lib 통합 라이브러리에 연결해야 합니다. 이 섹션에서는 링커를 만족시키는 세 가지 방법을 설명합니다.
첫 번째 옵션은 Visual Studio 프로젝트에 모든 C++/WinRT MSBuild 속성 및 대상을 추가하는 것입니다. 이렇게 하려면 프로젝트에 Microsoft.Windows.CppWinRT NuGet 패키지 설치합니다. Visual Studio에서 프로젝트를 열고
프로젝트 링크 설정을 사용하여 WindowsApp.lib
명시적으로 연결할 수도 있습니다. 또는 다음과 같이 소스 코드(예: pch.h
)에서 수행할 수 있습니다.
#pragma comment(lib, "windowsapp")
이제 C++/WinRT 코드를 컴파일하고 연결하고 프로젝트에 추가할 수 있습니다(예: 위의 C++/WinRT 빠른 시작 섹션에 표시된 것과 유사한 코드).
C++/WinRT에 대한 세 가지 주요 시나리오
C++/WinRT를 사용하고 익숙해지고 여기에 있는 설명서의 나머지 부분을 통해 작업할 때 다음 섹션에 설명된 대로 세 가지 주요 시나리오가 있음을 알 수 있습니다.
Windows API 및 형식 사용
즉,을 사용하여
Windows API 및 형식 작성
즉, 는 API와 형식을 생성합니다. 예를 들어 위의 섹션에 설명된 API 종류를 생성합니다. 또는 그래픽 API; 스토리지 및 파일 시스템 API; 네트워킹 API 등 자세한 내용은 C++/WinRT와 관련된 Author API을 참조하세요.
C++/WinRT를 사용해 API를 작성하는 것은, API를 구현하기 전에 IDL로 API의 형태를 정의해야 하기 때문에 API를 소비하는 것보다 더 복잡합니다. XAML 컨트롤에서 이 작업을 수행하는 가이드가 있습니다, C++/WinRT 속성에 바인딩하는 방법을 설명합니다.
XAML 애플리케이션
이 시나리오는 XAML UI 프레임워크에서 애플리케이션 및 컨트롤을 빌드하는 것입니다. XAML 애플리케이션에서 작업하는 것은 사용 및 작성의 조합에 해당합니다. 그러나 XAML은 현재 Windows의 주요 UI 프레임워크이며 Windows 런타임에 대한 영향력은 그에 비례하므로 고유한 시나리오 범주를 사용할 자격이 있습니다.
XAML은 리플렉션을 제공하는 프로그래밍 언어에 가장 적합합니다. C++/WinRT에서는 XAML 프레임워크와 상호 운용하기 위해 약간의 추가 작업을 수행해야 하는 경우가 있습니다. 이러한 모든 사례는 설명서에서 다룹니다. 시작하기 좋은 곳은
C++/WinRT로 작성된 샘플 앱
C++/WinRT 샘플 앱은 어디에서 찾을 수 있나요?.
중요 API
- SyndicationClient::RetrieveFeedAsync 메서드
- SyndicationFeed.Items 속성
- winrt::hstring 구조체
- winrt::hresult-error 구조체