Nasıl yapılır: Doğrudan WRL Bileşenlerinin Örneğini Oluşturma

Windows Çalışma Zamanı C++ Şablon Kitaplığı (WRL)Microsoft::WRL::Make ve Microsoft::WRL::D etails::MakeAndInitialize işlevlerini kullanarak onu tanımlayan modülden bir bileşenin örneğini oluşturmayı öğrenin.

Bileşenleri doğrudan örnekleyerek, sınıf fabrikalarına veya diğer mekanizmalara ihtiyacınız olmadığında ek yükü azaltabilirsiniz. Bir bileşenin örneğini doğrudan hem Evrensel Windows Platformu uygulamalarında hem de masaüstü uygulamalarında oluşturabilirsiniz.

C++ Şablon Kitaplığı'Windows Çalışma Zamanı kullanarak klasik bir COM bileşeni oluşturmayı ve bunu bir dış masaüstü uygulamasından oluşturmayı öğrenmek için bkz. Nasıl yapılır: Klasik COM Bileşeni Oluşturma.

Bu belgede iki örnek gösterilmektedir. İlk örnek, bir bileşenin örneğini oluşturmak için işlevini kullanır Make . İkinci örnek, MakeAndInitialize oluşturma sırasında başarısız olabilecek bir bileşenin örneğini oluşturmak için işlevini kullanır. (COM genellikle hataları göstermek için özel durumlar yerine HRESULT değerleri kullandığından, COM türü genellikle oluşturucusundan oluşturmaz. MakeAndInitialize bir bileşenin yöntemi aracılığıyla yapı bağımsız değişkenlerini doğrulamasını RuntimeClassInitialize sağlar.) Her iki örnek de temel bir günlükçü arabirimi tanımlar ve konsola ileti yazan bir sınıf tanımlayarak bu arabirimi uygular.

Önemli

Windows Çalışma Zamanı C++ Şablon Kitaplığı bileşenlerinin örneğini oluşturmak için işlecini kullanamazsınıznew. Bu nedenle, bir bileşeni doğrudan oluşturmak için her zaman veya MakeAndInitialize kullanmanız Make önerilir.

Temel bir günlükçü bileşeni oluşturmak ve örneği oluşturmak için

  1. Visual Studio'da bir Win32 Konsol Uygulaması projesi oluşturun. Projeyi, örneğin WRLLogger olarak adlandırın.

  2. Projeye bir Midl Dosyası (.idl) dosyası ekleyin, dosyayı ILogger.idladlandırın ve şu kodu ekleyin:

    import "ocidl.idl";
    
    // Prints text to the console.
    [uuid(AFDB9683-F18A-4B85-90D1-B6158DAFA46C)]
    interface ILogger : IUnknown
    {
        HRESULT Log([in] LPCWSTR text);
    }
    
  3. içeriğini WRLLogger.cppdeğiştirmek için aşağıdaki kodu kullanın.

    #include "pch.h" // Use stdafx.h in Visual Studio 2017 and earlier
    #include <wrl\implements.h>
    #include <comutil.h>
    
    #include "ILogger_h.h"
    
    using namespace Microsoft::WRL;
    
    // Writes logging messages to the console.
    class CConsoleWriter : public RuntimeClass<RuntimeClassFlags<ClassicCom>, ILogger>
    {
    public:
        STDMETHODIMP Log(_In_ PCWSTR text)
        {
            wprintf_s(L"%s\n", text);
            return S_OK;
        }
    
    private:
        // Make destroyable only through Release.
        ~CConsoleWriter()
        {
        }
    };
    
    int wmain()
    {
        ComPtr<CConsoleWriter> writer = Make<CConsoleWriter>();
        HRESULT hr = writer->Log(L"Logger ready.");
        return hr;
    }
    
    /* Output:
    Logger ready.
    */
    

Temel günlükçü bileşeni için yapı hatasını işlemek için

  1. Sınıfın tanımını CConsoleWriter değiştirmek için aşağıdaki kodu kullanın. Bu sürüm bir özel dize üye değişkeni barındırıyor RuntimeClass::RuntimeClassInitialize ve yöntemini geçersiz kılar. RuntimeClassInitialize çağrısı SHStrDup başarısız olursa başarısız olur.

    // Writes logging messages to the console.
    class CConsoleWriter : public RuntimeClass<RuntimeClassFlags<ClassicCom>, ILogger>
    {
    public:
        // Initializes the CConsoleWriter object.
        // Failure here causes your object to fail construction with the HRESULT you choose.
        HRESULT RuntimeClassInitialize(_In_ PCWSTR category)
        {
            return SHStrDup(category, &m_category);
        }
    
        STDMETHODIMP Log(_In_ PCWSTR text)
        {
            wprintf_s(L"%s: %s\n", m_category, text);
            return S_OK;
        }
    
    private:
        PWSTR m_category;
    
        // Make destroyable only through Release.
        ~CConsoleWriter()
        {
            CoTaskMemFree(m_category);
        }
    };
    
  2. tanımını wmaindeğiştirmek için aşağıdaki kodu kullanın. Bu sürüm, nesnesini örneklemek CConsoleWriter için kullanır MakeAndInitialize ve HRESULT sonucunu denetler.

    int wmain()
    {
        ComPtr<CConsoleWriter> writer;
        HRESULT hr = MakeAndInitialize<CConsoleWriter>(&writer, L"INFO");
        if (FAILED(hr))
        {
            wprintf_s(L"Object creation failed. Result = 0x%x", hr);
            return hr;
        }
        hr = writer->Log(L"Logger ready.");
        return hr;
    }
    
    /* Output:
    INFO: Logger ready.
    */
    

Ayrıca bkz.

Windows Çalışma Zamanı C++ Şablon Kitaplığı (WRL)
Microsoft::WRL::Make
Microsoft::WRL::D etails::MakeAndInitialize