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
Visual Studio'da bir Win32 Konsol Uygulaması projesi oluşturun. Projeyi, örneğin WRLLogger olarak adlandırın.
Projeye bir Midl Dosyası (.idl) dosyası ekleyin, dosyayı
ILogger.idl
adlandı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); }
içeriğini
WRLLogger.cpp
değ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
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ıyorRuntimeClass::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); } };
tanımını
wmain
değiştirmek için aşağıdaki kodu kullanın. Bu sürüm, nesnesini örneklemekCConsoleWriter
için kullanırMakeAndInitialize
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