다음을 통해 공유


C++/WinRT 문제 해결

비고

프로젝트 템플릿 지원을 제공하는 C++/WinRT VSIX(Visual Studio 확장)를 설치하고 사용하는 방법에 대한 자세한 내용은 C++/WinRT대한 Visual Studio 지원을 참조하세요.

이 주제는 바로 알아챌 수 있도록 맨 앞에 배치되었습니다. 아직 필요하지 않더라도 지금 알아두세요. 아래의 증상 및 해결 문제 해결 표는 새 코드를 잘라내거나 기존 앱을 포팅하는 데 도움이 될 수 있습니다. 포팅 작업을 진행 중이며 프로젝트의 빌드 및 실행 단계에 빠르게 도달하고자 한다면, 문제를 일으키는 중요하지 않은 코드를 주석 처리하거나 스텁 처리하여 임시로 진행할 수 있으며, 이후에 해당 빚을 갚기 위해 돌아올 수 있습니다.

질문과 대답 목록은질문과 대답을 참조하세요.

XAML 문제 추적

특히 예외 내에 의미 있는 오류 메시지가 없는 경우 XAML 구문 분석 예외를 진단하기 어려울 수 있습니다. 디버거가 최초로 발생하는 예외를 포착하도록 구성되어 있는지 확인합니다(구문 파싱 예외를 초기에 포착하고 그 처리를 시도하기 위해). 디버거에서 예외 변수를 검사하여 HRESULT 또는 메시지에 유용한 정보가 있는지 여부를 확인할 수 있습니다. 또한 Visual Studio의 출력 창에서 XAML 파서의 오류 메시지 출력을 확인합니다.

앱이 종료되고 XAML 마크업 구문 분석 중 처리되지 않은 예외가 발생한 경우, 이는 누락된 리소스에 대한 키 참조로 인한 결과일 수 있습니다. 사용자 컨트롤, 사용자 지정 컨트롤, 또는 사용자 지정 레이아웃 패널 내부에서 발생하는 예외일 수도 있습니다. 최후의 수단은 이진 분할입니다. XAML 페이지에서 마크업의 약 절반을 제거하고 앱을 다시 실행합니다. 그런 다음 오류가 제거한 절반 내에 있는지(어떤 경우든 복원해야 합니다) 또는 제거하지 않은 절반에 있는지 여부를 알 수 있습니다. 오류가 포함된 절반을 계속 분할하여 문제를 정확히 찾을 때까지 프로세스를 반복합니다.

증상 및 해결

증상 치료법 / 해결책
런타임에 HRESULT 값이 REGDB_E_CLASSNOTREGISTERED 인 예외가 발생합니다. "등록되지 않은 클래스" 예외가 표시되는 이유는 참조하세요..
C++ 컴파일러는 "'implements_type'오류가 생성됩니다. '<프로젝션된 형식>'"의 직접 또는 간접 기본 클래스의 멤버가 아닙니다. 이 문제는 구현 형식의 네임스페이스 정규화되지 않은 이름(예: MyRuntimeClass)을 사용하여 만들기 호출하고 해당 형식의 헤더를 포함하지 않은 경우에 발생할 수 있습니다. 컴파일러는 MyRuntimeClass 프로젝션된 형식으로 해석합니다. 솔루션은 구현 형식에 대한 헤더를 포함하는 것입니다(예:MyRuntimeClass.h).
C++ 컴파일러는 "삭제된 함수을 참조하려고 시도하는" 오류를 발생시킵니다. 을 호출하여을 템플릿 매개 변수로 전달할 때, 전달된 구현 형식에 = delete 기본 생성자가 있는 경우 이러한 문제가 발생할 수 있습니다. 구현 형식의 헤더 파일을 편집하고 = delete= default변경합니다. 런타임 클래스의 IDL에 생성자를 추가할 수도 있습니다.
INotifyPropertyChanged를 구현했지만, XAML 바인딩이 업데이트되지 않으며 UI가 PropertyChanged에 등록하고 있지 않습니다. XAML 구문에서 바인딩 표현식에 Mode=OneWay(또는 TwoWay)를 꼭 설정하세요. XAML 컨트롤 을 참조하고 C++/WinRT 속성에 바인딩하세요.
XAML 아이템 컨트롤을 옵저버블 컬렉션에 바인딩할 때, 런타임에 "매개 변수가 잘못되었습니다"라는 메시지와 함께 예외가 발생합니다. IDL 및 구현에서 관찰 가능한 컬렉션을 형식 Windows.Foundation.Collections.IVector<IInspectable>로 선언합니다. 그러나 해당 개체의 요소 형식이 T인 경우,T을 구현하는 Windows.Foundation.Collections.IObservableVector인 개체를 반환합니다. XAML 항목 컨트롤을 참조하고, C++/WinRT 컬렉션에 바인딩하세요.
C++ 컴파일러는 "'MyImplementationType_base<MyImplementationType>' 형식의 오류를 생성합니다.사용할 수 있는 적절한 기본 생성자가 없습니다. 이는 복잡한 생성자를 가진 형식에서 파생된 경우에 발생할 수 있습니다. 파생 형식의 생성자는 기본 형식의 생성자에 필요한 매개 변수를 반드시 전달해야 합니다. 구체적인 예제는 복잡한 생성자있는 형식에서 파생되는 방법을 보려면 을 참조하세요.
C++ 컴파일러는 "'const std::vector<std::wstring,std::allocator<_Ty>>'에서 'const winrt::param::async_iterable<winrt::hstring> &'으로 변환할 수 없습니다" 오류를 생성합니다. 이 오류는 std::wstring의 std::vector를 컬렉션을 예상하는 Windows 런타임 API에 전달할 때 발생할 수 있습니다. 자세한 내용은 표준 C++ 데이터 형식 및 C++/WinRT을 참조하세요.
C++ 컴파일러는 "'const std::vector<winrt::hstring,std::allocator<_Ty>>'에서 'const winrt::param::async_iterable<winrt::hstring> &'으로 변환할 수 없습니다" 오류를 발생시킵니다. 이 문제는 winrt::hstring의 std::vector를 컬렉션을 예상하는 비동기 Windows 런타임 API에 전달하고 벡터를 비동기 호출 수신자로 복사하거나 이동하지 않은 경우에 발생할 수 있습니다. 자세한 내용은 표준 C++ 데이터 형식 및 C++/WinRT을 참조하세요.
프로젝트를 열 때 Visual Studio는 "프로젝트에 대한 애플리케이션이 설치되지 않은"오류를 생성합니다. 아직 설치하지 않은 경우 Visual Studio의 새 프로젝트 대화 상자 내에서 C++ 개발 Windows 유니버설 도구를 설치해야 합니다. 문제가 해결되지 않으면, 프로젝트는 C++/WinRT Visual Studio 확장(VSIX)에 의존할 수 있습니다. (C++/WinRT에 대한 Visual Studio 지원은 을 참조하십시오).
Windows 앱 인증 키트 테스트는 런타임 클래스 "중 하나가 Windows 기본 클래스에서 파생되지 않는다는 오류를 생성합니다. 모든 구성 가능한 클래스는 궁극적으로 Windows 네임스페이스"의 형식에서 파생되어야 합니다. 애플리케이션에서 선언한 기본 클래스에서 파생된 모든 런타임 클래스는 구성 가능한 클래스라고 합니다. 구성 가능한 클래스의 최종 기본 클래스는 Windows.* 네임스페이스에서 시작되는 형식이어야 합니다. 예를 들어 windows.UI.Xaml.DependencyObject. XAML 컨트롤을 참조하세요. 자세한 내용은 C++/WinRT 속성 바인딩합니다.
C++ 컴파일러는 EventHandler 또는 TypedEventHandler 대리자 특수화에 대해 "T는 WinRT 형식이어야 합니다"라는 오류를 생성합니다. winrt::delegate<...T> 대신 사용해보세요. C++/WinRT에서 Author 이벤트를 참조하세요.
C++ 컴파일러는 Windows 런타임 비동기 작업 특수화에 대해 "T는 WinRT 형식이어야" 오류를 생성합니다. 대신 PPL(병렬 패턴 라이브러리) 작업을 반환하는 것을 고려하십시오. 동시성 및 비동기 작업참조하세요.
C++ 컴파일러는 winrt::xaml_typename호출할 때 "T는 WinRT 형식이어야" 오류를 생성합니다. 사용 형식으로는 구현 형식이 아닌 프로젝션된 형식을 사용하십시오. winrt::xaml_typename(예: BgLabelControlApp::BgLabelControl)를 사용하고, BgLabelControlApp::implementation::BgLabelControl는 사용하지 마십시오. XAML 사용자 지정(템플릿) 컨트롤을 참조하세요.
C++ 컴파일러는 "오류 C2220: 경고가 오류로 처리되었습니다 - 'object' 파일이 생성되지 않음"를 출력합니다. 경고를 수정하거나 C/C++>일반>경고를 오류로 처리아니요(/WX-)설정합니다.
개체가 제거된 후 C++/WinRT 개체의 이벤트 처리기가 호출되므로 앱이 충돌합니다. 이벤트 처리 대리자사용하여 이 포인터를 안전하게 액세스하는 참조하세요.
C++ 컴파일러는 "오류 C2338: 이 기능은 약한 참조 지원에만 사용됩니다"을 표시합니다. winrt::no_weak_ref 표식 구조체를 기본 클래스에 템플릿 인수로 전달한 형식에 대한 약한 참조를 요청하고 있습니다. 약한 참조 지원 선택 해제를 참조하세요.
C++ 컴파일러는 "consume_Something: 'auto'를 반환하는 함수는 정의되기 전에 사용할 수 없습니다"이라고 출력합니다. C3779 참조: 컴파일러가 "consume_Something: 'auto'를 반환하는 함수는 정의되기 전에 사용할 수 없습니다"라는 오류를 주는 이유는 무엇인가요?.
C++ 링커는 "오류 LNK2019: 해결되지 않은 외부 기호"를 생성합니다. 링커가 "LNK2019: 해결되지 않은 외부 기호" 오류를 제공하는 이유는 참조하세요..
LLVM 및 Clang 도구 체인은 C++/WinRT와 함께 사용할 때 오류를 생성합니다. C++/WinRT용 LLVM 및 Clang 도구 체인은 지원되지 않지만, 내부적으로 사용하는 방법을 에뮬레이트해보고 싶다면 LLVM/Clang를 사용하여 C++/WinRT로 컴파일할 수 있나요?에 설명된 실험을 시도해보실 수 있습니다.
C++ 컴파일러는 프로젝션된 형식에 대해 "사용 가능한 적절한 기본 생성자가 없습니다"이라는 메시지를 생성합니다. 런타임 클래스 개체의 초기화를 지연하거나 동일한 프로젝트에서 런타임 클래스를 사용하고 구현하려는 경우 std::nullptr_t 생성자를 호출해야 합니다. 자세한 내용은 C++/WinRT API 사용를 참조하세요.
C++ 컴파일러는 "오류 C3861: 'from_abi': 식별자를 찾을 수 없습니다base.h발생하는 기타 오류를 생성합니다. Visual Studio 2017(버전 15.8.0 이상)을 사용하고 Windows SDK 버전 10.0.17134.0(Windows 10 버전 1803)을 대상으로 하는 경우 이 오류가 표시될 수 있습니다. 이후 버전의 Windows SDK를 대상으로 지정하거나 C/C++언어규칙 모드를 프로젝트 속성을 설정합니다. 없음(/permissive- 프로젝트 속성에 표시되는 경우 C/C++언어명령줄 추가 옵션 그런 다음 삭제합니다.).
C++ 컴파일러는 "오류 C2039: 'IUnknown': ''global namespace''멤버가 아닙니다. C++/WinRT 프로젝트를 Windows SDK최신 버전으로 대상을 다시 지정하는 방법에 참조하세요.
C++ 링커는 "오류 LNK2019: 해결되지 않은 외부 기호 _WINRT_CanUnloadNow@0이 함수 _VSDesignerCanUnloadNow@0에서 참조되었습니다" 발생합니다. C++/WinRT 프로젝트를 Windows SDK최신 버전으로 대상을 다시 지정하는 방법에 참조하세요.
빌드 프로세스는 C++/WinRT VSIX가 더 이상 프로젝트 빌드 지원을 제공하지 않는 오류 메시지를 생성합니다. Microsoft.Windows.CppWinRT Nuget 패키지프로젝트 참조를 추가하세요. 프로젝트에 Microsoft.Windows.CppWinRT NuGet 패키지를 설치합니다. 자세한 내용은 이전 버전의 VSIX 확장참조하세요.
C++ 링커는와 관련하여 해결되지 않은 외부 기호로 인해 오류 LNK2019를 발생시키며, winrt::impl::consume_Windows_Foundation_Collections_IVector에 대한 언급이 있습니다. C++/WinRT 2.0. 이제 Windows 런타임 컬렉션에서 범위 기반 for 사용할 때는 #include <winrt/Windows.Foundation.Collections.h>해야 합니다.
"C++ 컴파일러는 "오류 C4002: 함수형 매크로 호출 GetCurrentTime에 사용된 인수가 너무 많습니다." GetCurrentTime 및/또는 TRY를 사용하여 모호성을 해결하는 방법을 보려면 참조하세요.
C++ 컴파일러는 "오류 C2334: '{' 앞에 예기치 않은 토큰이 있습니다. 명백한 함수 본문을건너뜁니다." GetCurrentTime 및/또는 TRY를 사용하여 모호성을 해결하는 방법을 보려면 참조하세요.
C++ 컴파일러는 "winrt::impl::produce<D,I> 추상 클래스를 인스턴스화할 수 없습니다, GetBindingConnector가 누락되었습니다." 를 생성합니다. 당신은 #include <winrt/Windows.UI.Xaml.Markup.h>을(를) 해야 합니다.
C++ 컴파일러는 "오류 C2039: 'promise_type'을 생성합니다. 'std::experimental::coroutine_traits<void>'"의 멤버가 아닙니다. 코루틴은 비동기 작업 개체 또는 winrt::fire_and_forget반환해야 합니다. 동시성 및 비동기 작업참조하세요.
프로젝트가 "'PopulatePropertyInfoOverride'의 모호한 액세스를" 생성합니다. 이 오류는 IDL에서 하나의 기본 클래스와 XAML 태그에서 다른 기본 클래스를 선언할 때 발생할 수 있습니다.
C++/WinRT 솔루션을 처음 로드하면 프로젝트 'MyProject.vcxproj'의 'Debug|x86' 구성에서 "디자인 타임 빌드에 실패했습니다. IntelliSense를 사용할 수 없을 수 있습니다.". 이 IntelliSense 문제는 처음 빌드한 후에 해결됩니다.
대리자를 등록할 때 winrt::auto_revoke을(를) 지정하려 시도하면 winrt::hresult_no_interface 예외가 발생합니다. 자동 해지 대리자가등록하지 못하는 경우 참조하세요.
C++/WinRT 앱에서 XAML을 사용하는 C# Windows Runtime 구성 요소를 사용할 때, 컴파일러가 "'MyNamespace_XamlTypeInfo': 'winrt::MyNamespace'의 멤버가 아닙니다"라는 형식의 오류를 발생시킵니다. 여기서 MyNamespace는 Windows Runtime 구성 요소의 네임스페이스 이름입니다. 사용 중인 C++/WinRT 앱의 pch.h에서 #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h>을 추가하고, 적절하게 MyNamespace를으로 대체하세요.
Visual Studio의 C++/WinRT 프로젝트에서 IntelliSense는 "오류 E1696: "소스 파일을 열 수 없습니다" 형식의 오류를 생성합니다. 새로 만든 프로젝트를 한 번 이상 컴파일합니다. 그런 다음 소스 코드 편집기에서 마우스 오른쪽 버튼을 클릭하고 >을 다시 검사한 다음>파일를 다시 검사합니다. 그러면 E1696을 비롯한 모든 IntelliSense 오류가 해결됩니다.

비고

이 항목이 질문에 답변하지 않은 경우 Visual Studio C++ 개발자 커뮤니티방문하거나 Stack Overflow 태그를 사용하여 도움말을 찾을 수 있습니다.