Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
C++/WinRT ile, std::wstring gibi C++ Standart Kitaplığı geniş dize türlerini kullanarak Windows Çalışma Zamanı API'lerini çağırabilirsiniz (not: std::string gibi dar dize türleriyle değil). C++/WinRT'nin winrt::hstring adlı özel bir dize türü vardır (C++/WinRT temel kitaplığında tanımlanır, yani %WindowsSdkDir%Include\<WindowsTargetPlatformVersion>\cppwinrt\winrt\base.h). Ve bu, Windows Çalışma Zamanı oluşturucularının, işlevlerinin ve özelliklerinin gerçekte alıp döndürdüğü dize türüdür. Ancak çoğu durumda hstring'in dönüştürme oluşturucuları ve dönüştürme işleçleri sayesinde istemci kodunuzda hstring'in farkında olup olmayacağını seçebilirsiniz.
API'ler yazarsanızhstring hakkında bilgi sahibi olmanız daha olasıdır.
C++'ta birçok dize türü vardır. Varyantlar, C++ Standart Kitaplığı'ndan std::basic_string ek olarak birçok kitaplıkta bulunur. C++17'de tüm dize türleri arasındaki boşlukları doldurmak için dize dönüştürme yardımcı programları ve std::basic_string_view vardır. winrt::hstring, std::wstring_view ile, std::basic_string_view’ın sağlamak üzere tasarlandığı birlikte çalışabilirliği sunacak şekilde dönüştürülebilirlik sağlar.
Uri ile std::wstring (ve isteğe bağlı olarak winrt::hstring) kullanma
Windows::Foundation::Uri bir winrt::hstring'den oluşturulur.
public:
Uri(winrt::hstring uri) const;
Ancak hstring'de , farkında olmanıza gerek kalmadan onunla çalışmanıza olanak sağlayan dönüştürme oluşturucuları vardır. Aşağıda, geniş dize sabitinden, geniş dize görünümünden ve std::wstring'den bir Uri'nin nasıl oluşturulacağını gösteren bir kod örneği verilmiştir.
#include <winrt/Windows.Foundation.h>
#include <string_view>
using namespace winrt;
using namespace Windows::Foundation;
int main()
{
using namespace std::literals;
winrt::init_apartment();
// You can make a Uri from a wide string literal.
Uri contosoUri{ L"http://www.contoso.com" };
// Or from a wide string view.
Uri contosoSVUri{ L"http://www.contoso.com"sv };
// Or from a std::wstring.
std::wstring wideString{ L"http://www.adventure-works.com" };
Uri awUri{ wideString };
}
Uri::D omain özellik erişimcisi hstring türündedir.
public:
winrt::hstring Domain();
Ancak, hstring'in std::wstring_view'e dönüştürme işleci sayesinde bu ayrıntıyı bilmek zorunlu değildir.
// Access a property of type hstring, via a conversion operator to a standard type.
std::wstring domainWstring{ contosoUri.Domain() }; // L"contoso.com"
domainWstring = awUri.Domain(); // L"adventure-works.com"
// Or, you can choose to keep the hstring unconverted.
hstring domainHstring{ contosoUri.Domain() }; // L"contoso.com"
domainHstring = awUri.Domain(); // L"adventure-works.com"
Benzer şekilde , IStringable::ToString hstring döndürür.
public:
hstring ToString() const;
Uri, IStringable arabirimini uygular.
// Access hstring's IStringable::ToString, via a conversion operator to a standard type.
std::wstring tostringWstring{ contosoUri.ToString() }; // L"http://www.contoso.com/"
tostringWstring = awUri.ToString(); // L"http://www.adventure-works.com/"
// Or you can choose to keep the hstring unconverted.
hstring tostringHstring{ contosoUri.ToString() }; // L"http://www.contoso.com/"
tostringHstring = awUri.ToString(); // L"http://www.adventure-works.com/"
hstring::c_str işlevini kullanarak bir hstring'den standart bir geniş dize alabilirsiniz (std::wstring'den alabildiğiniz gibi).
#include <iostream>
std::wcout << tostringHstring.c_str() << std::endl;
Bir hstring'iniz varsa ondan bir Uri yapabilirsiniz.
Uri awUriFromHstring{ tostringHstring };
hstring alan bir yöntem düşünün.
public:
Uri CombineUri(winrt::hstring relativeUri) const;
Az önce gördüğünüz tüm seçenekler bu gibi durumlarda da geçerlidir.
std::wstring contact{ L"contact" };
contosoUri = contosoUri.CombineUri(contact);
std::wcout << contosoUri.ToString().c_str() << std::endl;
hstring bir üye std::wstring_view dönüştürme işlecine sahiptir ve dönüştürme işlemine hiçbir ücret ödemeden ulaşılır.
void legacy_print(std::wstring_view view);
void Print(winrt::hstring const& hstring)
{
legacy_print(hstring);
}
winrt::hstring işlevleri ve işleçleri
winrt::hstring için çok sayıda oluşturucu, işleç, işlev ve yineleyici sağlanmıştır.
Hstring bir aralıktır, bu nedenle bunu aralık tabanlı forveya ile std::for_eachkullanabilirsiniz. Ayrıca, C++ Standart Kitaplığı'ndaki karşılıkları ile doğal ve verimli bir şekilde karşılaştırma için karşılaştırma işleçleri sağlar.
Hstring'i ilişkilendirici kapsayıcılar için anahtar olarak kullanmak için ihtiyacınız olan her şeyi içerir.
Birçok C++ kitaplığının std::string kullandığını ve yalnızca UTF-8 metniyle çalıştığını biliyoruz. Kolaylık sağlamak için , winrt::to_string ve winrt::to_hstring gibi yardımcıları ileri geri dönüştürme için sağlarız.
WINRT_ASSERT bir makro tanımıdır ve _ASSERTE genişletilir.
winrt::hstring w{ L"Hello, World!" };
std::string c = winrt::to_string(w);
WINRT_ASSERT(c == "Hello, World!");
w = winrt::to_hstring(c);
WINRT_ASSERT(w == L"Hello, World!");
Hstring işlevleri ve işleçleri hakkında daha fazla örnek ve bilgi için winrt::hstring API başvuru konusuna bakın.
winrt::hstring ve winrt::param::hstring için gerekçe
Windows Çalışma Zamanı, wchar_t karakterleri temel alınarak uygulanır, ancak Windows Çalışma Zamanı'ın Uygulama İkili Arabirimi (ABI), ne std::wstring ne de std::wstring_view'ın sağladıklarının bir alt kümesidir. Bunları kullanmak önemli ölçüde verimsizliğe yol açabilir. Bunun yerine C++/WinRT, temelindeki HSTRING ile tutarlı, değiştirilemez bir dizeyi temsil eden ve std::wstring’inkine benzer bir arabirimle gerçekleştirilen winrt::hstring sağlar.
Mantıksal olarak winrt::hstring kabul etmesi beklenen C++/WinRT giriş parametrelerinin aslında winrt::param::hstring beklediğini fark edebilirsiniz. param ad alanı, C++ Standart Kitaplığı türlerine doğal olarak bağlanmak ve kopyaları ve diğer verimsizlikleri önlemek üzere giriş parametrelerini iyileştirmek için özel olarak kullanılan bir tür kümesi içerir. Bu türleri doğrudan kullanmamalısınız. Kendi işlevleriniz için bir iyileştirme kullanmak istiyorsanız std::wstring_view kullanın. Ayrıca bkz. PARAMETRELERI ABI sınırına geçirme.
Sonuç olarak, Windows Çalışma Zamanı dize yönetiminin ayrıntılarını büyük ölçüde yok sayabilir ve bildiklerinizle verimlilikle çalışabilirsiniz. Ve bu, dizelerin Windows Çalışma Zamanı'da ne kadar yoğun kullanıldığı düşünüldüğünde önemlidir.
Dizeleri biçimlendirme
Dize biçimlendirme için bir seçenek std::wostringstream'dir. Aşağıda basit bir hata ayıklama izleme iletisini biçimlendiren ve görüntüleyen bir örnek verilmiş.
#include <sstream>
#include <winrt/Microsoft.UI.Input.h>
#include <winrt/Microsoft.UI.Xaml.Input.h>
...
void MainPage::OnPointerPressed(winrt::Microsoft::UI::Xaml::Input::PointerRoutedEventArgs const& e)
{
winrt::Windows::Foundation::Point const point{ e.GetCurrentPoint(nullptr).Position() };
std::wostringstream wostringstream;
wostringstream << L"Pointer pressed at (" << point.X << L"," << point.Y << L")" << std::endl;
::OutputDebugString(wostringstream.str().c_str());
}
Özellik ayarlamanın doğru yolu
Bir değeri bir ayarlayıcı işlevine geçirerek bir özellik ayarlarsınız. İşte bir örnek.
// The right way to set the Text property.
myTextBlock.Text(L"Hello!");
Aşağıdaki kod yanlış. Derlenir, ancak yaptığı tek şey winrt::hstring türünde, Text() eriştirici işlevi tarafından döndürülen geçici değeri değiştirmek ve ardından sonucu atmaktır.
// *Not* the right way to set the Text property.
myTextBlock.Text() = L"Hello!";
Önemli API'ler
Windows developer