DllRegisterServer 구현
[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine 및 오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]
마지막 단계는 DllRegisterServer 함수를 구현하는 것입니다. 구성 요소가 포함된 DLL은 이 함수를 내보내야 합니다. 함수는 설정 애플리케이션에서 호출되거나 사용자가 Regsvr32.exe 도구를 실행할 때 호출됩니다.
다음 예제에서는 DlLRegisterServer의 최소 구현을 보여줍니다.
STDAPI DllRegisterServer(void)
{
return AMovieDllRegisterServer2(TRUE);
}
AMovieDllRegisterServer2 함수는 의 모든 구성 요소에 대한 레지스트리 항목을 만듭니다.
g_Templates
배열이 아닌 경우 그러나 이 함수에는 몇 가지 제한 사항이 있습니다. 먼저 모든 필터를 "DirectShow Filters" 범주(CLSID_LegacyAmFilterCategory)에 할당하지만 모든 필터가 이 범주에 속하는 것은 아닙니다. 예를 들어 캡처 필터 및 압축 필터에는 고유한 범주가 있습니다. 둘째, 필터가 하드웨어 디바이스를 지원하는 경우 AMovieDLLRegisterServer2 가 처리하지 않는 두 가지 추가 정보인 중간 및 핀 범주를 등록해야 할 수 있습니다. 매체는 버스와 같은 하드웨어 디바이스의 통신 방법을 정의합니다. 핀 범주는 핀의 함수를 정의합니다. 매체에 대한 자세한 내용은 Microsoft DDK(Windows 드라이버 개발 키트)의 "KSPIN_MEDIUM"를 참조하세요. 핀 범주 목록은 Pin 속성 집합을 참조하세요.
필터 범주, 중간 또는 핀 범주를 지정하려면 DllRegisterServer 내에서 IFilterMapper2::RegisterFilter 메서드를 호출합니다. 이 메서드는 필터에 대한 정보를 지정하는 REGFILTER2 구조체에 대한 포인터를 사용합니다.
문제를 다소 복잡하게 만들기 위해 REGFILTER2 구조체는 핀 등록을 위한 두 가지 형식을 지원합니다. dwVersion 멤버는 형식을 지정합니다.
- dwVersion이 1이면 핀 형식이 AMOVIESETUP_PIN(앞에서 설명).
- dwVersion이 2이면 핀 형식은 REGFILTERPINS2입니다.
REGFILTERPINS2 구조체에는 핀 매체 및 핀 범주에 대한 항목이 포함됩니다. 또한 AMOVIESETUP_PIN 부울 값으로 선언하는 일부 항목에 대해 비트 플래그를 사용합니다.
다음 예제에서는 DllRegisterServer 내에서 IFilterMapper2::RegisterFilter를 호출하는 방법을 보여줍니다.
REGFILTER2 rf2FilterReg = {
1, // Version 1 (no pin mediums or pin category).
MERIT_NORMAL, // Merit.
1, // Number of pins.
&sudPins // Pointer to pin information.
};
STDAPI DllRegisterServer(void)
{
HRESULT hr;
IFilterMapper2 *pFM2 = NULL;
hr = AMovieDllRegisterServer2(TRUE);
if (FAILED(hr))
return hr;
hr = CoCreateInstance(CLSID_FilterMapper2, NULL, CLSCTX_INPROC_SERVER,
IID_IFilterMapper2, (void **)&pFM2);
if (FAILED(hr))
return hr;
hr = pFM2->RegisterFilter(
CLSID_SomeFilter, // Filter CLSID.
g_wszName, // Filter name.
NULL, // Device moniker.
&CLSID_VideoCompressorCategory, // Video compressor category.
g_wszName, // Instance data.
&rf2FilterReg // Pointer to filter information.
);
pFM2->Release();
return hr;
}