Nasıl yapılır: WRL Kullanarak Windows Çalışma Zamanı Bileşenini Etkinleştirme ve Kullanma

Bu belge nasıl kullanılacağını gösterir Windows Çalışma Zamanı C++ Şablon Kitaplığı (WRL) başlatmak için Windows Çalışma Zamanı ve etkinleştirmek ve kullanmak nasıl bir Windows Çalışma Zamanı bileşen.

[!NOT]

Bu örnek, yerleşik bir etkinleştirir Windows Çalışma Zamanı bileşen.Benzer şekilde etkinleştirebilirsiniz, kendi bileşeni oluşturmayı öğrenmek için bkz: İzlenecek Yol: WRL Kullanarak Temel Windows Çalışma Zamanı Bileşeni Oluşturma.

Bir bileşen kullanmak için bir arabirim işaretçisi bileşen tarafından uygulanan türe edinmeniz gerekir.Ve çünkü, temel alınan teknoloji Windows Çalışma Zamanı olan Bileşen Nesne Modeli (COM) türünde bir örnek sağlamak için COM kurallara uymalıdır.Örneğin, tutmalıdır başvuru sayısı türü bellekten silindiğinde belirler.

Kullanımını kolaylaştırmak için Windows Çalışma Zamanı, WRL akıllı işaretçi şablonu sağlar ComPtr<T>, başvuru sayımı, otomatik olarak gerçekleştirir.When you declare a variable, specify ComPtr<interface-name> identifier.Bir arabirim üyesi erişmek için ok üye erişim işlecini uygulamak (->) için tanımlayıcı.

Önemli notÖnemli

Bir arabirim işlevini çağırdığınızda, her zaman test HRESULT dönüş değeri.

Etkinleştirme ve kullanma Windows çalışma zamanı bileşeni

Aşağıdaki adımları kullanın Windows::Foundation::IUriRuntimeClass arabirimi için bir etkinleştirme fabrikası oluşturma yöntemini göstermek için bir Windows Çalışma Zamanı bileşeni, bu bileşenin bir örneğini oluşturmak ve bir özellik değeri almak.Onlar da nasıl başlatılacağını gösterir Windows Çalışma Zamanı.Tam bir örnek aşağıda verilmiştir.

Önemli notÖnemli

Genellikle kullanmanıza rağmen WRL , bir Windows Mağazası app, bu örnek, bir konsol uygulaması gösterim amacıyla kullanır.Gibi işlevleri wprintf_s kullanılamaz bir Windows Mağazası app.Türleri ve kullanabileceğiniz fonksiyonlar hakkında daha fazla bilgi için bir Windows Mağazası app, bkz: /ZW ile desteklenmeyen CRT işlevlerinin ve Win32 ve COM için Windows Store apps.

Etkinleştirmek ve Windows çalışma zamanı bileşeni kullanmak için

  1. İçerir (#include) gerektiği gibi Windows Çalışma Zamanı, WRL, ya da standart C++ Kitaplığı üstbilgileri.

    #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;
    

    Öneririz, kullanan using namespace kodunu daha kolay okunur hale getirmek için .cpp dosyasındaki yönergesi.

  2. İçinde app yürüten iş parçacığı başlatılamıyor.Her uygulama kendi iş parçacığı ve iş parçacığı modeli başlatması gerekir.Bu örnek kullanır Microsoft::WRL::Wrappers::RoInitializeWrapper başlatmak için sınıf Windows Çalışma Zamanı ve RO_INIT_MULTITHREADED iş parçacığı modeli olarak.RoInitializeWrapper Sınıfı çağrıları Windows::Foundation::Initialize inşaat, at ve Windows::Foundation::Uninitialize zaman yok.

    // Initialize the Windows Runtime.
    RoInitializeWrapper initialize(RO_INIT_MULTITHREADED);
    if (FAILED(initialize))
    {
        return PrintError(__LINE__, initialize);
    }
    

    İkinci ifade, RoInitializeWrapper::HRESULT operatörü döndürür HRESULT görüşmeden Windows::Foundation::Initialize.

  3. Oluşturma bir etkinleştirme Fabrika için ABI::Windows::Foundation::IUriRuntimeClassFactory arabirim.

    // 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ürlerini tanımlamak için tam adını kullanır.RuntimeClass_Windows_Foundation_Uri Parametresi tarafından sağlanan bir dize olan Windows Çalışma Zamanı ve gerekli olan çalışma zamanı sınıf adını içerir.

  4. Başlatmak bir Microsoft::WRL::Wrappers::HString bir URI'yi temsil değişken "https://www.microsoft.com".

    // Create a string that represents a URI.
    HString uriHString;
    hr = uriHString.Set(L"https://www.microsoft.com");
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    

    İçinde Windows Çalışma Zamanı, sizin için bir dize, bellek yok Windows Çalışma Zamanı kullanır.Bunun yerine, Windows Çalışma Zamanı onu korur ve işlemler için kullanır ve sonra onu oluşturan bir işleyici arabellek döner bir arabelleğe sığdığında, dize bir kopyasını oluşturur.

  5. Kullanım IUriRuntimeClassFactory::CreateUri fabrika yöntemi oluşturmak için bir ABI::Windows::Foundation::IUriRuntimeClass nesne.

    // Create the IUriRuntimeClass object.
    ComPtr<IUriRuntimeClass> uri;
    hr = uriFactory->CreateUri(uriHString.Get(), &uri);
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    
  6. Arama IUriRuntimeClass::get_Domain değerini almak için bir yöntem Domain özelliği.

    // Get the domain part of the URI.
    HString domainName;
    hr = uri->get_Domain(domainName.GetAddressOf());
    if (FAILED(hr))
    {
        return PrintError(__LINE__, hr);
    }
    
  7. Yazıcı konsolunda etki alanı adı ve dönün.Tüm ComPtr ve RAII nesne kapsam bırakın 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şlevini URI dizesiyle temel Unicode biçimini alır.

Tam bir örnek aşağıdadır:

// 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"https://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 ardından Visual Studio projesinde yapıştırın veya adlı bir dosyaya yapıştırın wrl tüketen component.cpp ve Visual Studio komut istemi penceresinde aşağıdaki komutu çalıştırın.

cl.exe wrl-consume-component.cpp runtimeobject.lib

Ayrıca bkz.

Kavramlar

Windows Çalışma Zamanı C++ Şablon Kitaplığı (WRL)