다음을 통해 공유


팩터리 템플릿 배열

[이 페이지와 연결된 기능인 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_lpfnNewm_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_Templatesg_cTemplates 클래스 팩터리에서 찾을 것으로 예상되는 전역 변수이므로 정확히 해당 이름이 있어야 합니다.

DirectShow 필터 DLL을 만드는 방법