Aracılığıyla paylaş


C++/WinRT'ye giriş

 

 

C++/WinRT, üst bilgi dosyası tabanlı bir kitaplık olarak uygulanan ve modern Windows API'sine birinci sınıf erişim sağlamak üzere tasarlanmış, Windows Çalışma Zamanı (WinRT) API'leri için tamamen standart bir modern C++17 dil projeksiyonudur. C++/WinRT ile, standartlara uyumlu herhangi bir C++17 derleyicisini kullanarak Windows Çalışma Zamanı API'leri yazabilir ve kullanabilirsiniz. Windows SDK'sı C++/WinRT içerir; sürüm 10.0.17134.0 (Windows 10, sürüm 1803) ile kullanıma sunulmuştur.

C++/WinRT, Microsoft'un C++/CX dil projeksiyonu ve Windows Çalışma Zamanı C++ Şablon Kitaplığı (WRL)için önerilen değişimidir. C++/WinRT hakkındaki konuların tam listesi, C++/CX ve WRL ile birlikte çalışma ve bunlardan geçiş yapma hakkında bilgi içerir.

Önemli

C++/WinRT'nin dikkat edilmesi gereken en önemli parçalarından bazıları, C++/WinRT için SDK desteği ve C++/WinRT, XAML, VSIX uzantısı ve NuGet paketiiçin Visual Studio desteği bölümlerinde açıklanmıştır.

Ayrıca bkz. C++/WinRT örnek uygulamalarını nerede bulabilirim?.

Dil projeksiyonları

Windows Çalışma Zamanı, Bileşen Nesne Modeli (COM) API'lerini temel alır vedil projeksiyonları aracılığıyla erişilecek şekilde tasarlanmıştır. Projeksiyon, COM ayrıntılarını gizler ve belirli bir dil için daha doğal bir programlama deneyimi sağlar.

Windows Çalışma Zamanı API'si başvuru içeriğindeki C++/WinRT dil projeksiyonu

Windows Çalışma Zamanı API'lerinegöz atarken, sağ üstteki Dil birleşik giriş kutusuna tıklayın ve API söz dizimi bloklarını C++/WinRT dil projeksiyonunda göründükleri şekilde görüntülemek için C++/WinRT'i seçin.

C++/WinRT, XAML, VSIX uzantısı ve NuGet paketi için Visual Studio desteği

Visual Studio desteği için Visual Studio 2022, Visual Studio 2019 veya Visual Studio 2017 (en az sürüm 15.6; en az 15.7 önerilir) gerekir. Visual Studio Yükleyicisi'nin içinden Evrensel Windows Platformu geliştirme iş yükünü yükleyin. Evrensel Windows Platformu geliştirmeYükleme Ayrıntıları bölümünde, henüz yapmadıysanız C++ (v14x) Evrensel Windows Platformu araçları seçeneğini işaretleyin. Ayrıca, Windows Ayarları>Gizlilik ve güvenlik (Windows 10: Güncelleştirme ve Güvenlik) >Geliştiriciler içinGeliştirici modu seçeneğini etkinleştirin (Windows 10: Uygulamaları Dışarıdan yükleme seçeneği değil).

Visual Studio ve Windows SDK'nın en son sürümleriyle geliştirmenizi öneririz. 10.0.17763.0 (Windows 10, sürüm 1809) tarihinden önce Windows SDK ile birlikte gönderilen bir C++/WinRT sürümü kullanıyorsanız, yukarıda belirtilen Windows ad alanı üst bilgilerini kullanmak için 10.0.17134.0 projenizde en düşük Windows SDK hedef sürümüne (Windows 10, sürüm 1803).

Visual Studio 2022, C++/WinRT projesi ve öğe şablonları yerleşik olarak sunulur, böylece C++/WinRT geliştirmeye hemen başlayabilirsiniz. Ayrıca C++/WinRT öngörülen türlerin Visual Studio yerel hata ayıklama görselleştirmesi (natvis) ile birlikte gelir; C# hata ayıklamasına benzer bir deneyim sağlar. Natvis, hata ayıklama derlemeleri için otomatiktir. Daha fazla bilgi için bkz. C++/WinRT için Visual Studio yerel hata ayıklama görselleştirmesi.

Visual Studio'nun eski sürümleri için, Visual Studio Market'ndan C++/WinRT Visual Studio Uzantısı (VSIX) en son sürümünü indirip yüklemek isteyeceksiniz.

  • VSIX uzantısı, Visual Studio'da C++/WinRT proje ve öğe şablonları sağlar.
  • Ayrıca, Visual Studio'nun C++/WinRT projeksiyon türleri için yerel hata ayıklama görselleştirmesini (natvis) size sunar.

C++/WinRT için Visual Studio proje şablonları aşağıdaki bölümlerde açıklanmıştır. VSIX uzantısının en son sürümü yüklü yeni bir C++/WinRT projesi oluşturduğunuzda, yeni C++/WinRT projesi Microsoft.Windows.CppWinRT NuGet paketiniotomatik olarak yükler. Microsoft.Windows.CppWinRT NuGet paketi C++/WinRT derleme desteği (MSBuild özellikleri ve hedefleri) sağlayarak projenizi geliştirme makinesi ile derleme aracısı arasında taşınabilir hale getirir (VSIX uzantısının değil yalnızca NuGet paketinin yüklü olduğu).

Alternatif olarak, Microsoft.Windows.CppWinRT NuGet paketini el ile yükleyerek var olan bir projeyi dönüştürebilirsiniz. VSIX uzantısının en son sürümünü yükledikten (veya güncelleştirdikten) sonra, var olan projeyi Visual Studio'da açın, NuGet Paketlerini YönetProject'e tıklayın...Gözat'a tıklayın, arama kutusuna Microsoft.Windows.CppWinRT yazın veya yapıştırın, arama sonuçlarında öğeyi seçin ve ardından yükle'ye tıklayarak bu projenin paketini yükleyin. Paketi ekledikten sonra, cppwinrt.exe aracını çağırma dahil olmak üzere proje için C++/WinRT MSBuild desteği alırsınız.

Önemli

VSIX uzantısının 1.0.190128.4'ten önceki bir sürümüyle oluşturulmuş (veya çalışmak üzere yükseltilen) projeleriniz varsa bkz. VSIX uzantısının önceki sürümleri. Bu bölüm, projelerinizin yapılandırması hakkında önemli bilgiler içerir ve bunları VSIX uzantısının en son sürümünü kullanacak şekilde yükseltmek için bilmeniz gerekir.

  • C++/WinRT C++/WinRT C++17 standardının özelliklerini kullandığından NuGet paketi, Visual Studio'da C/C++ >Dil>C++ Dil Standardı>ISO C++17 Standart (/std:c++17) proje özelliğini ayarlar.
  • Ayrıca /bigobj derleyici seçeneğini ekler.
  • etkinleştirmek için co_await derleyici seçeneğini ekler.
  • XAML derleyicisine C++/WinRT codegen yaymasını sağlar.
  • Uyumluluk modunu da ayarlamak isteyebilirsiniz: Evet (/izin verilen-), kodunuzu standartlara uygun olacak şekilde daha da kısıtlar.
  • Dikkat edilmesi gereken başka bir proje özelliği de C/C++>Genel>Uyarıları Hatalar Olarak İşle. Bunu tada göre Evet(/WX) veya Hayır (/WX-) olarak ayarlayın. Bazen, cppwinrt.exe aracı tarafından oluşturulan kaynak dosyalar, uygulamanızı bunlara ekleyene kadar uyarılar oluşturur.

Sisteminiz yukarıda açıklandığı gibi ayarlandıysa, Visual Studio'da bir C++/WinRT projesi oluşturup oluşturabilir veya açabilir ve dağıtabilirsiniz.

Sürüm 2.0'da Microsoft.Windows.CppWinRT NuGet paketi cppwinrt.exe aracını içerir. C++/WinRT kodundan kullanılmak üzere meta verilerde açıklanan API'leri projeleri üst bilgi dosyası tabanlı standart bir C++ kitaplığı oluşturmak için aracını bir Windows Çalışma Zamanı meta verilerine () işaret edebilirsiniz. Windows Çalışma Zamanı meta verileri (.winmd) dosyaları, Windows Çalışma Zamanı API'sinin yüzeyini açıklamanın kurallı bir yolunu sağlar. Meta verilere cppwinrt.exe işaret ederek, ikinci veya üçüncü taraf bir Windows Çalışma Zamanı bileşeninde veya kendi uygulamanızda uygulanan herhangi bir çalışma zamanı sınıfı ile kullanmak üzere bir kitaplık oluşturabilirsiniz. Daha fazla bilgi için C++/WinRT ile API'leri kullanmabölümüne bakın.

C++/WinRT ile, COM stili programlamaya başvurmadan standart C++ kullanarak kendi çalışma zamanı sınıflarınızı da uygulayabilirsiniz. Çalışma zamanı sınıfı için, türlerinizi bir IDL dosyasında açıklarsınız, ardından midl.exe ve cppwinrt.exe uygulama şablon kaynak kodu dosyalarınızı sizin için oluşturur. Alternatif olarak, C++/WinRT temel sınıfından türeterek arabirimleri uygulayabilirsiniz. Daha fazla bilgi için bkz. C++/WinRT ile Yazma API'leri.

cppwinrt.exe aracının, proje özellikleri aracılığıyla ayarlanan özelleştirme seçeneklerinin listesi için Microsoft.Windows.CppWinRT NuGet paketi , README'ye bakın.

C++/WinRT MSBuild desteğini kullanan bir projeyi, proje içinde yüklü Microsoft.Windows.CppWinRT NuGet paketinin varlığıyla tanımlayabilirsiniz.

VSIX uzantısı tarafından sağlanan Visual Studio proje şablonları aşağıda verilmiştir.

Boş Uygulama (C++/WinRT)

XAML kullanıcı arabirimine sahip bir Evrensel Windows Platformu (UWP) uygulaması için proje şablonu.

Visual Studio, her XAML işaretleme dosyasının arkasında yer alan Arabirim Tanım Dili (IDL) (.idl) dosyasından uygulama ve üst bilgi saplamaları oluşturmak için XAML derleyicisi desteği sağlar. Bir IDL dosyasında, uygulamanızın XAML sayfalarında başvurmak istediğiniz yerel çalışma zamanı sınıflarını tanımlayın ve ardından Generated Files'da uygulama şablonlarını ve Generated Files\sources'de kalıp tür tanımlarını oluşturmak için projeyi bir kez derleyin. Ardından, yerel çalışma zamanı sınıflarınızı uygulamak için bu gövde türü tanımlamaları referans olarak kullanın. Bkz. Çalışma zamanı sınıflarının Midl dosyalarına (.idl) ayrıştırılması.

C++/WinRT için Visual Studio'daki XAML tasarım yüzeyi desteği C# ile eşliğe yakındır. Visual Studio'da, bir C++/WinRT projesine olay işleyicileri eklemek için Özellikler penceresinin Olaylar sekmesini kullanabilirsiniz. Ayrıca kodunuza el ile olay işleyicileri de ekleyebilirsiniz. Daha fazla bilgi için bkz. C++/WinRT'da temsilcileri kullanarak olayları işleme .

Çekirdek Uygulama (C++/WinRT)

XAML kullanmayan bir Evrensel Windows Platformu (UWP) uygulaması için proje şablonu.

Bunun yerine, Windows.ApplicationModel.Core ad alanı için C++/WinRT Windows ad alanı üst bilgisini kullanır. Oluşturup çalıştırdıktan sonra, renkli bir kare eklemek için boş bir alana tıklayın; ardından renkli bir kareye tıklayarak sürükleyin.

Windows Konsol Uygulaması (C++/WinRT)

Windows Masaüstü için konsol kullanıcı arabirimine sahip bir C++/WinRT istemci uygulaması için proje şablonu.

Windows Masaüstü Uygulaması (C++/WinRT)

Windows Masaüstü için C++/WinRT istemci uygulaması proje şablonu, bir Win32 MessageBoxiçinde Windows Çalışma Zamanı Windows.Foundation.Uri görüntüler.

Windows Çalışma Zamanı Bileşeni (C++/WinRT)

Bir bileşen için proje şablonu; genellikle Evrensel Windows Platformu'ndan (UWP) tüketim için.

Bu şablon, IdL'den Windows Çalışma Zamanı meta verilerinin (midl.exe) oluşturulduğu ve ardından Windows Çalışma Zamanı meta verilerinden uygulama ve üst bilgi saplamalarının oluşturulduğu >cppwinrt.exe.winmd araç zincirini gösterir.

Bir IDL dosyasında, bileşeninizdeki çalışma zamanı sınıflarını, varsayılan arabirimlerini ve uyguladıkları diğer arabirimleri tanımlayın. module.g.cpp, module.h.cpp, Generated Files'de uygulama şablonlarını ve Generated Files\sources'te taslak tür tanımlarını oluşturmak için projeyi bir kez derleyin ve çalıştırın. Ardından, bileşeninizde çalışma zamanı sınıflarını uygulamak için saplama türü tanımlarını referans olarak kullanın. Bkz. Çalışma zamanı sınıflarının Midl dosyalarına (.idl) ayrıştırılması.

Oluşturulmuş Windows Çalışma Zamanı bileşeninin ikili dosyasını ve .winmd'ı bunları tüketen UWP uygulamasıyla birlikte paketleyin.

VSIX uzantısının önceki sürümleri

VSIX uzantısının en son sürümünüyüklemenizi (veya sürümüne güncelleştirmenizi) öneririz. Varsayılan olarak kendisini güncelleştirecek şekilde yapılandırılır. Bunu yaparsanız ve VSIX uzantısının 1.0.190128.4'ten önceki bir sürümüyle oluşturulmuş projeleriniz varsa, bu bölüm bu projeleri yeni sürümle çalışacak şekilde yükseltme hakkında önemli bilgiler içerir. Güncelleştirmezseniz, bu bölümdeki bilgileri yararlı bulmaya devam edersiniz.

Desteklenen Windows SDK ve Visual Studio sürümleri ve Visual Studio yapılandırması açısından, yukarıdaki C++/WinRT, XAML, VSIX uzantısı ve NuGet paketi bölümü için Visual Studio desteğindeki bilgiler VSIX uzantısının önceki sürümleri için geçerlidir. Aşağıdaki bilgiler, önceki sürümlerle oluşturulan (veya çalışmak üzere yükseltilen) projelerin davranışı ve yapılandırmasıyla ilgili önemli farkları açıklar.

1.0.181002.2'den önce oluşturuldu

Projeniz VSIX uzantısının 1.0.181002.2'den önceki bir sürümüyle oluşturulduysa, VSIX uzantısının bu sürümünde C++/WinRT derleme desteği yerleşiktir. Projenizde <CppWinRTEnabled>true</CppWinRTEnabled> dosyasında .vcxproj özelliği ayarlanmıştır.

<Project ...>
    <PropertyGroup Label="Globals">
        <CppWinRTEnabled>true</CppWinRTEnabled>
...

Microsoft.Windows.CppWinRT NuGet paketini el ile yükleyerek projenizi yükseltebilirsiniz. VSIX uzantısının en son sürümünü yükledikten (veya sürümüne yükselttikten) sonra projenizi Visual Studio'da açın, Proje NuGet Paketlerini Yönet...'e tıklayın,Gözat'a tıklayın, arama kutusuna Microsoft.Windows.CppWinRT yazın veya yapıştırın, arama sonuçlarında öğeyi seçin ve ardından paketi projeniz için yüklemek üzere Yükle'ye tıklayın.

1.0.181002.2 ile 1.0.190128.3 arasında oluşturuldu (veya sürümüne yükseltildi)

Projeniz VSIX uzantısının 1.0.181002.2 ile 1.0.190128.3 (dahil) arasında bir sürümüyle oluşturulduysa, proje şablonu tarafından projeye otomatik olarak Microsoft.Windows.CppWinRT NuGet paketi yüklenmiştir. Bu aralıktaki VSIX uzantısının bir sürümünü kullanmak için eski bir projeyi de yükseltmiş olabilirsiniz. Bunu yaptıysanız, derleme desteği bu aralıktaki VSIX uzantısının sürümlerinde de mevcut olduğundan, yükseltilen projenizde Microsoft.Windows.CppWinRT NuGet paketinin yüklü olabilir veya olmayabilir.

Projenizi yükseltmek için önceki bölümdeki yönergeleri izleyin ve projenizde Microsoft.Windows.CppWinRT NuGet paketinin yüklü olduğundan emin olun.

Geçersiz yükseltme yapılandırmaları

VSIX uzantısının en son sürümüyle, microsoft.windows.CppWinRT NuGet paketi de yüklü değilse projenin özelliğine sahip olması geçerli değildir. Bu yapılandırmaya sahip bir proje, "C++/WinRT VSIX artık proje derleme desteği sağlamaz" hata mesajı üretir. Lütfen Microsoft.Windows.CppWinRT Nuget paketine bir proje başvurusu ekleyin."

Yukarıda belirtildiği gibi, bir C++/WinRT projesinde artık NuGet paketinin yüklü olması gerekir.

<CppWinRTEnabled> öğesi artık kullanımdan kaldırılmış olduğundan, isteğe bağlı olarak .vcxprojdüzenleyebilir ve öğesini silebilirsiniz. Kesinlikle gerekli değildir, ancak bu bir seçenektir.

Ayrıca, .vcxproj<RequiredBundles>$(RequiredBundles);Microsoft.Windows.CppWinRT</RequiredBundles>içeriyorsa, C++/WinRT VSIX uzantısının yüklenmesine gerek kalmadan derlemek için bunu kaldırabilirsiniz.

C++/WinRT için SDK desteği

Artık yalnızca uyumluluk nedeniyle mevcut olsa da, sürüm 10.0.17134.0 (Windows 10, sürüm 1803) itibarıyla, Windows SDK'sı birinci taraf Windows API'lerini (Windows ad alanında Windows Çalışma Zamanı API'leri) kullanmaya yönelik üst bilgi dosyası tabanlı standart bir C++ kitaplığı içerir. Bu üst bilgiler %WindowsSdkDir%Include<WindowsTargetPlatformVersion>\cppwinrt\winrtklasörünün içindedir. Windows SDK sürüm 10.0.17763.0 (Windows 10, sürüm 1809) itibarıyla bu üst bilgiler projenizin $(GeneratedFilesDir) klasörünün içinde sizin için oluşturulur.

Uyumluluk için windows SDK'sı da cppwinrt.exe aracıyla birlikte gelir. Ancak, bunun yerine cppwinrt.exe NuGet paketiyle birlikte gelen en son sürümünü yüklemenizi ve kullanmanızı öneririz. Bu paket ve cppwinrt.exeyukarıdaki bölümlerde açıklanmıştır.

C++/WinRT projeksiyonunda özel türler

C++/WinRT programlamanızda standart C++ dil özelliklerini ve bazı C++ Standart Kitaplık veri türleri dahil olmak üzere Standart C++ veri türlerini ve C++/WinRTkullanabilirsiniz. Ancak projeksiyondaki bazı özel veri türlerini de fark edersiniz ve bunları kullanmayı seçebilirsiniz. Örneğin, C++/WinRT kullanmaya başlamahızlı başlangıç kodu örneğinde winrt::hstring kullanıyoruz.

winrt::com_array, belirli bir noktada kullanma olasılığınız olan başka bir türdür. Ancak winrt::array_viewgibi bir türü doğrudan kullanma olasılığınız daha düşüktür. Alternatif olarak, C++ Standart Kitaplığı'nda eşdeğer bir tür belirdiğinde değiştirilmesi gereken bir kodunuz olmaması için bu kodu kullanmamayı seçebilirsiniz.

Uyarı

C++/WinRT Windows ad alanı üst bilgilerini yakından incelerseniz görebileceğiniz türler de vardır. Örnek olarak winrt::param::hstringverilebilir, ancak koleksiyon örnekleri de vardır. Bunlar yalnızca giriş parametrelerinin bağlanmasını optimize etmek için var ve önemli performans iyileştirmeleri sağlarlar, ayrıca ilgili standart C++ türleri ve kapsayıcılar için çoğu çağrı deseninin sorunsuz çalışmasını sağlarlar. Bu türler yalnızca en çok değer ekledikleri durumlarda projeksiyon tarafından kullanılır. Bunlar yüksek oranda iyileştirilmiştir ve genel kullanım için değildir; Bunları kendiniz kullanmakla cezbedilmemelisiniz. Bunlar uygulama türleri olduğundan ve bu nedenle değiştirilebilir olduğundan, winrt::impl ad alanından herhangi bir şey de kullanmamalısınız. standart türleri veya winrt ad alanıtürleri kullanmaya devam etmelisiniz.

Ayrıca bkz. Parametreleri ABI sınırına geçirme.

Önemli API'ler

  • winrt::hstring yapısı
  • winrt ad alanı