다음을 통해 공유


클래스 팩터리 및 팩터리 템플릿

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngineMedia Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드에서 DirectShow 대신 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

이 항목에서는 DirectShow 기본 클래스를 사용하여 DirectShow 필터에 대한 DLL을 구현하는 방법을 설명합니다.

클라이언트는 COM 개체의 instance 만들기 전에 CoGetClassObject 함수를 호출하여 개체의 클래스 팩터리 instance 만듭니다. 그런 다음 클라이언트는 클래스 팩터리의 IClassFactory::CreateInstance 메서드를 호출합니다. 실제로 구성 요소를 만들고 요청된 인터페이스에 대한 포인터를 반환하는 클래스 팩터리입니다. CoCreateInstance 함수는 함수 호출 내에서 이러한 단계를 결합합니다.

다음 그림에서는 메서드 호출 시퀀스를 보여 줍니다.

클래스 팩터리를 만들기 위한 메서드 호출

CoGetClassObjectDLL에 정의된 DllGetClassObject 함수를 호출합니다. 이 함수는 클래스 팩터리를 만들고 클래스 팩터리의 인터페이스에 대한 포인터를 반환합니다. DirectShow는 DllGetClassObject 를 구현하지만 함수는 특정 방식으로 코드를 사용합니다. 작동 방식을 이해하려면 DirectShow에서 클래스 팩터리를 구현하는 방법을 이해해야 합니다.

클래스 팩터리는 다른 COM 개체를 만드는 전용 COM 개체입니다. 각 클래스 팩터리에는 만드는 개체의 한 가지 유형이 있습니다. DirectShow에서 모든 클래스 팩터리는 동일한 C++ 클래스 CClassFactory의 instance. 클래스 팩터리는 팩터리 템플릿이라고도 하는 다른 클래스인 CFactoryTemplate을 통해 특수화됩니다. 각 클래스 팩터리에는 팩터리 템플릿에 대한 포인터가 있습니다. 팩터리 템플릿에는 구성 요소의 CLSID(클래스 식별자) 및 구성 요소를 만드는 함수에 대한 포인터와 같은 특정 구성 요소에 대한 정보가 포함되어 있습니다.

DLL은 DLL의 각 구성 요소에 대해 하나씩 팩터리 템플릿의 전역 배열을 선언합니다. DllGetClassObject가 새 클래스 팩터리를 만들 때 일치하는 CLSID가 있는 템플릿을 검색합니다. 이를 찾은 경우 일치하는 템플릿에 대한 포인터를 포함하는 클래스 팩터리를 만듭니다. 클라이언트가 IClassFactory::CreateInstance를 호출하면 클래스 팩터리는 템플릿에 정의된 인스턴스화 함수를 호출합니다.

다음 그림에서는 메서드 호출 시퀀스를 보여 줍니다.

dll의 클래스 팩터리 템플릿

이 아키텍처의 이점은 전체 클래스 팩터리를 구현하지 않고도 인스턴스화 함수와 같이 구성 요소와 관련된 몇 가지만 정의할 수 있다는 것입니다.

DirectShow 필터 DLL을 만드는 방법