Nasıl yapılır: WRL Kullanarak Windows Çalışma Zamanı Bileşenini Etkinleştirme ve Kullanma
Bu belgede, Windows Çalışma Zamanı başlatmak için Windows Çalışma Zamanı C++ Şablon Kitaplığı'nın (WRL) nasıl kullanılacağı ve bir Windows Çalışma Zamanı bileşeninin nasıl etkinleştirilip kullanılacağı gösterilmektedir.
Bir bileşeni kullanmak için, bileşen tarafından uygulanan tür için bir arabirim işaretçisi almanız gerekir. Windows Çalışma Zamanı temel teknolojisi Bileşen Nesne Modeli (COM) olduğundan, türün bir örneğini korumak için COM kurallarına uymanız gerekir. Örneğin, türün bellekten ne zaman silineceğini belirleyen başvuru sayısını korumanız gerekir.
Windows Çalışma Zamanı kullanımını basitleştirmek için Windows Çalışma Zamanı C++ Şablon Kitaplığı, başvuru sayma işlemini otomatik olarak gerçekleştiren ComPtr<T> akıllı işaretçi şablonunu sağlar. Bir değişken bildirdiğinizde arabirim adı >
tanımlayıcısı belirtin.ComPtr<
Arabirim üyesine erişmek için tanımlayıcıya ok üye erişim işlecini (->
) uygulayın.
Önemli
Bir arabirim işlevini çağırdığınızda HRESULT dönüş değerini her zaman test edin.
Windows Çalışma Zamanı Bileşenini Etkinleştirme ve Kullanma
Aşağıdaki adımlar, bir Windows Çalışma Zamanı bileşeni için etkinleştirme fabrikası oluşturma, bu bileşenin bir örneğini oluşturma ve özellik değeri alma adımlarını göstermek için arabirimini kullanırWindows::Foundation::IUriRuntimeClass
. Ayrıca Windows Çalışma Zamanı nasıl başlatacaklarını da gösterirler. Tam örnek aşağıda verilmiştir.
Önemli
Genellikle bir Evrensel Windows Platformu (UWP) uygulamasında Windows Çalışma Zamanı C++ Şablon Kitaplığı'nı kullansanız da, bu örnekte çizim için bir konsol uygulaması kullanılır. gibi wprintf_s
işlevler UWP uygulamasında kullanılamaz. UWP uygulamasında kullanabileceğiniz türler ve işlevler hakkında daha fazla bilgi için bkz. Evrensel Windows Platformu uygulamalarında desteklenmeyen CRT işlevleri ve UWP uygulamaları için Win32 ve COM.
Windows Çalışma Zamanı bileşenini etkinleştirmek ve kullanmak için
Gerekli tüm Windows Çalışma Zamanı, Windows Çalışma Zamanı C++ Şablon Kitaplığı veya C++ Standart Kitaplığı üst bilgilerini ekleyin (
#include
).#include <Windows.Foundation.h> #include <wrl\wrappers\corewrappers.h> #include <wrl\client.h> #include <stdio.h> using namespace ABI::Windows::Foundation; using namespace Microsoft::WRL; using namespace Microsoft::WRL::Wrappers;
Kodu daha okunabilir hale getirmek için .cpp dosyanızdaki yönergesini kullanmanızı
using namespace
öneririz.Uygulamanın yürütüldiği iş parçacığını başlatın. Her uygulamanın iş parçacığı ve iş parçacığı modelini başlatması gerekir. Bu örnek, Windows Çalışma Zamanı başlatmak için Microsoft::WRL::Wrappers::RoInitializeWrapper sınıfını kullanır ve iş parçacığı oluşturma modeli olarak RO_INIT_MULTITHREADED belirtir. Sınıf
RoInitializeWrapper
, inşaatta veWindows::Foundation::Uninitialize
yok edildiğinde ararWindows::Foundation::Initialize
.// Initialize the Windows Runtime. RoInitializeWrapper initialize(RO_INIT_MULTITHREADED); if (FAILED(initialize)) { return PrintError(__LINE__, initialize); }
İkinci deyimde RoInitializeWrapper::HRESULT işleci çağrısından
Windows::Foundation::Initialize
öğesini döndürürHRESULT
.Arabirim için
ABI::Windows::Foundation::IUriRuntimeClassFactory
bir etkinleştirme fabrikası oluşturun.// Get the activation factory for the IUriRuntimeClass interface. ComPtr<IUriRuntimeClassFactory> uriFactory; HRESULT hr = GetActivationFactory(HStringReference(RuntimeClass_Windows_Foundation_Uri).Get(), &uriFactory); if (FAILED(hr)) { return PrintError(__LINE__, hr); }
Windows Çalışma Zamanı türleri tanımlamak için tam adlar kullanır.
RuntimeClass_Windows_Foundation_Uri
parametresi, Windows Çalışma Zamanı tarafından sağlanan ve gerekli çalışma zamanı sınıf adını içeren bir dizedir.URI'yi
"https://www.microsoft.com"
temsil eden bir Microsoft::WRL::Wrappers::HString değişkeni başlatın.// Create a string that represents a URI. HString uriHString; hr = uriHString.Set(L"http://www.microsoft.com"); if (FAILED(hr)) { return PrintError(__LINE__, hr); }
Windows Çalışma Zamanı, Windows Çalışma Zamanı kullanacağı bir dize için bellek ayırmazsınız. Bunun yerine, Windows Çalışma Zamanı dizenizin bir kopyasını, işlemler için koruduğu ve kullandığı bir arabellekte oluşturur ve ardından oluşturduğu arabelleğe bir tanıtıcı döndürür.
IUriRuntimeClassFactory::CreateUri
Nesne oluşturmakABI::Windows::Foundation::IUriRuntimeClass
için fabrika yöntemini kullanın.// Create the IUriRuntimeClass object. ComPtr<IUriRuntimeClass> uri; hr = uriFactory->CreateUri(uriHString.Get(), &uri); if (FAILED(hr)) { return PrintError(__LINE__, hr); }
özelliğinin
IUriRuntimeClass::get_Domain
değerini almak için yöntemini çağırınDomain
.// Get the domain part of the URI. HString domainName; hr = uri->get_Domain(domainName.GetAddressOf()); if (FAILED(hr)) { return PrintError(__LINE__, hr); }
Etki alanı adını konsola yazdırın ve geri dönün. Tüm
ComPtr
ve RAII nesneleri kapsamı bırakır ve otomatik olarak serbest bırakılır.// Print the domain name and return. wprintf_s(L"Domain name: %s\n", domainName.GetRawBuffer(nullptr)); // All smart pointers and RAII objects go out of scope here.
WindowsGetStringRawBuffer işlevi, URI dizesinin temel unicode biçimini alır.
Tam örnek aşağıda verilmiştir:
// wrl-consume-component.cpp
// compile with: runtimeobject.lib
#include <Windows.Foundation.h>
#include <wrl\wrappers\corewrappers.h>
#include <wrl\client.h>
#include <stdio.h>
using namespace ABI::Windows::Foundation;
using namespace Microsoft::WRL;
using namespace Microsoft::WRL::Wrappers;
// Prints an error string for the provided source code line and HRESULT
// value and returns the HRESULT value as an int.
int PrintError(unsigned int line, HRESULT hr)
{
wprintf_s(L"ERROR: Line:%d HRESULT: 0x%X\n", line, hr);
return hr;
}
int wmain()
{
// Initialize the Windows Runtime.
RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);
if (FAILED(initialize))
{
return PrintError(__LINE__, initialize);
}
// Get the activation factory for the IUriRuntimeClass interface.
ComPtr<IUriRuntimeClassFactory> uriFactory;
HRESULT hr = GetActivationFactory(HStringReference(RuntimeClass_Windows_Foundation_Uri).Get(), &uriFactory);
if (FAILED(hr))
{
return PrintError(__LINE__, hr);
}
// Create a string that represents a URI.
HString uriHString;
hr = uriHString.Set(L"http://www.microsoft.com");
if (FAILED(hr))
{
return PrintError(__LINE__, hr);
}
// Create the IUriRuntimeClass object.
ComPtr<IUriRuntimeClass> uri;
hr = uriFactory->CreateUri(uriHString.Get(), &uri);
if (FAILED(hr))
{
return PrintError(__LINE__, hr);
}
// Get the domain part of the URI.
HString domainName;
hr = uri->get_Domain(domainName.GetAddressOf());
if (FAILED(hr))
{
return PrintError(__LINE__, hr);
}
// Print the domain name and return.
wprintf_s(L"Domain name: %s\n", domainName.GetRawBuffer(nullptr));
// All smart pointers and RAII objects go out of scope here.
}
/*
Output:
Domain name: microsoft.com
*/
Kod Derleniyor
Kodu derlemek için kopyalayın ve visual studio projesine yapıştırın veya adlı wrl-consume-component.cpp
bir dosyaya yapıştırın ve ardından visual studio komut istemi penceresinde aşağıdaki komutu çalıştırın.
cl.exe wrl-consume-component.cpp runtimeobject.lib