팩터리 템플릿 배열
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
팩터리 템플릿에는 다음과 같은 공용 멤버 변수가 포함됩니다.
const WCHAR * m_Name; // Name
const CLSID * m_ClsID; // CLSID
LPFNNewCOMObject m_lpfnNew; // Function to create an instance
// of the component
LPFNInitRoutine m_lpfnInit; // Initialization function (optional)
const AMOVIESETUP_FILTER * m_pAMovieSetup_Filter; // Set-up information (for filters)
m_lpfnNew 및 m_lpfnInit 두 함수 포인터는 다음 형식 정의를 사용합니다.
typedef CUnknown *(CALLBACK *LPFNNewCOMObject)(LPUNKNOWN pUnkOuter, HRESULT *phr);
typedef void (CALLBACK *LPFNInitRoutine)(BOOL bLoading, const CLSID *rclsid);
첫 번째는 구성 요소에 대한 인스턴스화 함수입니다. 두 번째는 선택적 초기화 함수입니다. 초기화 함수를 제공하는 경우 DLL 진입점 함수 내부에서 호출됩니다. (DLL 진입점 함수는 이 문서의 뒷부분에서 설명합니다.)
CUnknown에서 상속되는 CMyComponent라는 구성 요소가 포함된 DLL을 만들고 있다고 가정합니다. DLL에 다음 항목을 제공해야 합니다.
- CMyComponent의 새 instance 반환하는 public 메서드인 초기화 함수입니다.
- g_Templates 라는 팩터리 템플릿의 전역 배열입니다 . 이 배열에는 CMyComponent에 대한 팩터리 템플릿이 포함되어 있습니다.
- 배열의 크기를 지정하는 g_cTemplates 전역 변수입니다.
다음 예제에서는 이러한 항목을 선언하는 방법을 보여줍니다.
// Public method that returns a new instance.
CUnknown * WINAPI CMyComponent::CreateInstance(LPUNKNOWN pUnk, HRESULT *pHr)
{
CMyComponent *pNewObject = new CMyComponent(NAME("My Component"), pUnk, pHr );
if (pNewObject == NULL) {
*pHr = E_OUTOFMEMORY;
}
return pNewObject;
}
CFactoryTemplate g_Templates[1] =
{
{
L"My Component", // Name
&CLSID_MyComponent, // CLSID
CMyComponent::CreateInstance, // Method to create an instance of MyComponent
NULL, // Initialization function
NULL // Set-up information (for filters)
}
};
int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]);
메서드는 CreateInstance
클래스 생성자를 호출하고 새 클래스 instance 대한 포인터를 반환합니다.
pUnk 매개 변수는 집계 IUnknown에 대한 포인터입니다. 이 매개 변수를 클래스 생성자에 간단히 전달할 수 있습니다. 매개 변수 pHr 은 HRESULT 값에 대한 포인터입니다. 클래스 생성자는 이를 적절한 값으로 설정하지만 생성자가 실패하면 값을 E_OUTOFMEMORY 설정합니다.
NAME 매크로는 디버그 빌드에서 문자열을 생성하지만 소매 빌드에서는 NULL로 확인됩니다. 이 예제에서는 구성 요소에 디버그 로그에 표시되지만 최종 버전의 메모리를 차지하지 않는 이름을 지정하는 데 사용됩니다.
CreateInstance
클래스 팩터리는 팩터리 템플릿의 함수 포인터를 참조하기 때문에 메서드는 어떤 이름도 가질 수 있습니다. 그러나 g_Templates 및 g_cTemplates 클래스 팩터리에서 찾을 것으로 예상되는 전역 변수이므로 정확히 해당 이름이 있어야 합니다.
관련 항목