Bagikan melalui


Cara: Membuat Instans Komponen WRL Secara Langsung

Pelajari cara menggunakan Windows Runtime C++ Template Library (WRL)Microsoft::WRL::Make dan Microsoft::WRL::D etails::MakeAndInitialize functions untuk membuat instans komponen dari modul yang mendefinisikannya.

Dengan membuat instans komponen secara langsung, Anda dapat mengurangi overhead ketika Anda tidak memerlukan pabrik kelas atau mekanisme lainnya. Anda dapat membuat instans komponen langsung di aplikasi Platform Windows Universal dan di aplikasi desktop.

Untuk mempelajari cara menggunakan Windows Runtime C++ Template Library untuk membuat komponen COM klasik dan membuat instans dari aplikasi desktop eksternal, lihat Cara: Membuat Komponen COM Klasik.

Dokumen ini memperlihatkan dua contoh. Contoh pertama menggunakan Make fungsi untuk membuat instans komponen. Contoh kedua menggunakan MakeAndInitialize fungsi untuk membuat instans komponen yang dapat gagal selama konstruksi. (Karena COM biasanya menggunakan nilai HRESULT, alih-alih pengecualian, untuk menunjukkan kesalahan, jenis COM biasanya tidak dilemparkan dari konstruktornya. MakeAndInitialize memungkinkan komponen untuk memvalidasi argumen konstruksinya melalui RuntimeClassInitialize metode .) Kedua contoh menentukan antarmuka pencatat dasar dan mengimplementasikan antarmuka tersebut dengan menentukan kelas yang menulis pesan ke konsol.

Penting

Anda tidak dapat menggunakan new operator untuk membuat instans komponen Pustaka Templat C++ Windows Runtime. Oleh karena itu, kami sarankan Anda selalu menggunakan Make atau MakeAndInitialize membuat instans komponen secara langsung.

Untuk membuat dan membuat instans komponen pencatat dasar

  1. Di Visual Studio, buat proyek Aplikasi Konsol Win32. Beri nama proyek, misalnya, WRLLogger.

  2. Tambahkan file Midl File (.idl) ke proyek, beri nama file ILogger.idl, lalu tambahkan kode ini:

    import "ocidl.idl";
    
    // Prints text to the console.
    [uuid(AFDB9683-F18A-4B85-90D1-B6158DAFA46C)]
    interface ILogger : IUnknown
    {
        HRESULT Log([in] LPCWSTR text);
    }
    
  3. Gunakan kode berikut untuk menggantikan konten WRLLogger.cpp.

    #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.
    */
    

Untuk menangani kegagalan konstruksi untuk komponen pencatat dasar

  1. Gunakan kode berikut untuk mengganti definisi CConsoleWriter kelas. Versi ini menyimpan variabel anggota string privat dan mengambil RuntimeClass::RuntimeClassInitialize alih metode . RuntimeClassInitialize gagal jika panggilan gagal SHStrDup .

    // 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. Gunakan kode berikut untuk mengganti definisi wmain. Versi ini menggunakan untuk membuat CConsoleWriter instans MakeAndInitialize objek dan memeriksa hasil HRESULT.

    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.
    */
    

Baca juga

Pustaka Templat Windows Runtime C++ (WRL)
Microsoft::WRL::Make
Microsoft::WRL::D etails::MakeAndInitialize