방법: 직접 WRL 구성 요소 인스턴스화
사용 하는 방법에 알아봅니다.는 Windows 런타임 C++ 템플릿 라이브러리 (WRL) Microsoft::WRL::Make 및 Microsoft::WRL::Details::MakeAndInitialize 함수를 정의 하는 모듈에서 구성 요소를 인스턴스화할 수 있습니다.
클래스 팩터리 또는 기타 메커니즘이 필요 하지 않은 구성 요소를 직접 인스턴스화하고 오버 헤드가 줄일 수 있습니다.둘 다에서 직접 구성 요소를 인스턴스화할 수 있습니다 Windows 스토어 응용 프로그램 및 데스크톱 응용 프로그램에서.
사용 하는 방법을 알아보려면 기본을 만들 수 Windows 런타임 구성 요소 및 외부에서 인스턴스화할 Windows 스토어 응용 프로그램을 참조 하십시오 연습: WRL을 사용하여 기본 Windows 런타임 구성 요소 만들기.사용 하는 방법을 알아보려면 WRL 클래식 COM 구성 요소를 만들고 외부 데스크톱 응용 프로그램에서 인스턴스화할 보려면 방법: WRL을 사용하여 기본 COM 구성 요소 만들기.
이 문서의 두 가지 예제를 보여 줍니다.첫 번째 예제를 사용 하는 Make 함수는 구성 요소를 인스턴스화할 수 있습니다.두 번째 예제는 MakeAndInitialize 함수를 생성 하는 동안 실패할 수 있는 구성 요소를 인스턴스화합니다.(일반적으로 COM을 사용 하기 때문에 HRESULT 오류를 나타내는 예외를 대신 값을 COM 형식이 일반적으로 throw 하지 않습니다 해당 생성자에서 합니다.MakeAndInitialize건설 인수를 통해 유효성을 검사할 구성 요소 사용은 RuntimeClassInitialize 메서드입니다.) 두 예제 모두 기본로 거 인터페이스를 정의 하 고 콘솔에 메시지를 작성 하는 클래스를 정의 하 여 해당 인터페이스를 구현 합니다.
중요 |
---|
사용할 수 없습니다는 new 연산자를 인스턴스화할 수 WRL 구성 요소입니다.따라서 항상 사용 하는 것이 좋습니다 Make 또는 MakeAndInitialize 구성 요소를 직접 인스턴스화할 수 있습니다. |
만들고 기본로 거 구성 요소를 인스턴스화할 수
Visual Studio 작성 한 Win32 콘솔 응용 프로그램 프로젝트입니다.예를 들어, 프로젝트의 이름을 WRLLogger.
추가 된 Midl 파일 (.idl) : 파일 이름, 파일을 프로젝트에 ILogger.idl,이 코드를 추가:
import "ocidl.idl"; // Prints text to the console. [uuid(AFDB9683-F18A-4B85-90D1-B6158DAFA46C)] interface ILogger : IUnknown { HRESULT Log([in] BSTR text); }
Wrllogger.cpp의 내용을 바꾸려면 다음 코드를 사용 합니다.
#include "stdafx.h" #include <wrl\implements.h> #include <comutil.h> #include "ILogger_h.h" // comutil.h requires static linkage to comsuppw.lib. #pragma comment(lib, "comsuppw") using namespace Microsoft::WRL; // Writes logging messages to the console. class CConsoleWriter : public RuntimeClass<RuntimeClassFlags<ClassicCom>, ILogger> { public: STDMETHODIMP Log(_In_ BSTR text) { if (text == nullptr) { return E_POINTER; } wprintf_s(L"%s\n", text); return S_OK; } private: // Make destroyable only through Release. ~CConsoleWriter() { } }; int _tmain() { ComPtr<CConsoleWriter> writer = Make<CConsoleWriter>(); HRESULT hr = writer->Log(L"Logger ready."); return hr; } /* Output: Logger ready. */
기본로 거 구성 요소의 구문 오류를 처리 하려면
다음 코드를 사용 하 여 정의를 대체 하는 CConsoleWriter 클래스입니다.이 버전 전용 문자열 멤버 변수 및 재정의 보유 하 고 있는 RuntimeClass::RuntimeClassInitialize 메서드.RuntimeClassInitialize제공 된 매개 변수가 nullptr.
// 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_ BSTR category) { if (category == nullptr) { return E_POINTER; } m_category = category; return S_OK; } STDMETHODIMP Log(_In_ BSTR text) { if (text == nullptr) { return E_POINTER; } wprintf_s(L"%s: %s\n", m_category.GetBSTR(), text); return S_OK; } private: _bstr_t m_category; // Make destroyable only through Release. ~CConsoleWriter() { } };
다음 코드를 사용 하 여 정의를 바꾸려면 _tmain.이 버전을 사용 하 여 MakeAndInitialize 두 인스턴스화할 수 CConsoleWriter 개체입니다.데모에 대 한 첫 번째 호출이 성공 하 고 두 번째 호출은 실패 합니다.
int _tmain() { BSTR category = L"INFO"; ComPtr<CConsoleWriter> writer; HRESULT hr = MakeAndInitialize<CConsoleWriter>(&writer, category); if (FAILED(hr)) { wprintf_s(L"Object creation failed. Result = 0x%x", hr); return hr; } hr = writer->Log(L"Logger ready."); if (FAILED(hr)) { return hr; } wprintf_s(L"\n"); category = nullptr; hr = MakeAndInitialize<CConsoleWriter>(&writer, category); if (FAILED(hr)) { wprintf_s(L"Object creation failed. Result = 0x%x.\n", hr); return hr; } else { return writer->Log(L"Logger ready."); } } /* Output: INFO: Logger ready. Object creation failed. Result = 0x80004003. */
참고 항목
참조
Microsoft::WRL::Details::MakeAndInitialize