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;
}