Nasıl yapılır: Doğrudan WRL Bileşenlerinin Örneğini Oluşturma
Nasıl kullanılacağını öğrenmek Windows Çalışma Zamanı C++ Şablon Kitaplığı (WRL) Microsoft::WRL::Make ve Microsoft::WRL::Details::MakeAndInitialize tanımladığı modülün bir bileşenin örneğini oluşturmak için İşlevler.
Sınıf üreticisi veya diğer düzeneklerin gerekmediğinde bileşenleri doğrudan oluşturarak, ek yükü azaltabilirsiniz.Bir bileşen her ikisi de, doğrudan örneklenebilen Windows Mağazası apps ve Masaüstü uygulamaları.
Nasıl kullanılacağını öğrenmek için WRL bir temel oluşturmak için Windows Çalışma Zamanı bileşen ve dış örneğini Windows Mağazası app, bkz: İzlenecek Yol: WRL Kullanarak Temel Windows Çalışma Zamanı Bileşeni Oluşturma.Nasıl kullanılacağını öğrenmek için WRL klasik bir COM bileşeni oluşturmanız ve bir harici Masaüstü uygulamadan örneğini oluşturmak için bkz: Nasıl yapılır: WRL Kullanarak Klasik COM Bileşeni Oluşturma.
Bu belgede, iki örnek gösterilir.İlk örnek kullanan Make bir bileşen örneğini oluşturmak için işlev.İkinci örnek kullanan MakeAndInitialize oluşturma sırasında başarısız olabilir bir bileşenin örneğini oluşturmak için işlev. (COM genellikle kullandığı için HRESULT değerleri, hataları göstermek için özel durumlar, yerine COM türü genellikle değil throw onun kurucusundan.MakeAndInitializeİnşaat değişkenlerinin aracılığıyla doğrulamak bir bileşen sağlar RuntimeClassInitialize yöntemi.) Örneklerin her ikisi de temel Günlükçü arabirimini tanımlamak ve iletiler konsola yazan bir sınıf tanımlayarak bu arabirimi uygulayın.
Önemli |
---|
Kullanamazsınız new işleç'ın örneğini oluşturmak için WRL bileşenleri.Bu nedenle, her zaman kullanmanızı öneririz Make veya MakeAndInitialize doğrudan bir bileşenin örneğini oluşturmak için. |
Oluşturmak ve temel Günlükçü bileşen örneğini oluşturmak için
Visual Studio'da oluşturmak bir Win32 konsol uygulaması proje.Örneğin, proje adını WRLLogger.
Ekleme bir MIDL dosyası (.idl) dosya projeye, dosya adı ILogger.idlve bu kodu ekleyin:
import "ocidl.idl"; // Prints text to the console. [uuid(AFDB9683-F18A-4B85-90D1-B6158DAFA46C)] interface ILogger : IUnknown { HRESULT Log([in] LPCWSTR text); }
WRLLogger.cpp içeriğini değiştirmek için şu kodu kullanın.
#include "stdafx.h" #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. */
Yapım hatası temel logger bileşeni için işlemek için
Tanımını değiştirmek için şu kodu kullanın CConsoleWriter sınıf.Bu sürüm özel dize üye değişkeni ve geçersiz kılmaları tutan RuntimeClass::RuntimeClassInitialize yöntem.RuntimeClassInitializebaşarısız olur çağrısı SHStrDup 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ı değiştirmek için şu kodu kullanın wmain.Bu sürümü kullanan MakeAndInitialize örneğini oluşturmak için CConsoleWriter nesne ve çek HRESULT sonucu.
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.
Başvuru
Microsoft::WRL::Details::MakeAndInitialize