DirectX Media Object DMO 의 생성 DMO 의 등록 [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
클라이언트가 DMO 를 사용하려면 , CLSID 가 사용자의 시스템에 등록되지 않으면 안 된다. 이 처리는, DLL 의 DllRegisterServer 함수를 사용해 실시한다. Active Template Library (ATL)를 사용하고 있는 경우는, ATL 위저드가 이 함수를 자동적으로 생성한다.
또, 생성 한 DMO 를, DMO 의 표준 카테고리에 등록할 수도 있다. 이것에 의해, 클라이언트는 DMOEnum 함수를 사용해 그 DMO 를 발견할 수 있게 된다. 카테고리는 GUID 에 의해 정의되어 「DMO 의 GUID 」의 주제에 일람이 나타나고 있다.
카테고리에의 DMO 의 등록은 실시하지 않아도 좋다. 등록하려면 ,DMORegister 함수를 호출해, DMO 의 프렌들리명, CLSID, 카테고리를 지정한다. 옵션으로서 DMO 가 지원 하는 미디어 타입세트를 등록할 수도 있다. 더 자세한 정보는, 「DMO 의 미디어 타입」을 참조할것.
다음 예는 PCM 오디오의 입력과 출력을 지원 하는 오디오 이펙트 DMO 를 등록하는 방법을 나타내고 있다. 이 경우, 입력 타입과 출력 타입은 같다.
STDAPI DllRegisterServer(void)
{
// PCM 오디오 이펙트 DMO 로서 DMO 를 등록한다.
DMO_PARTIAL_MEDIATYPE mt;
mt.type = MEDIATYPE_Audio;
mt.subtype = MEDIASUBTYPE_PCM;
HRESULT hr = DMORegister(
L"MyDMO", // 프렌들리명
CLSID_MyDMO, // CLSID
DMOCATEGORY_AUDIO_EFFECT, // 카테고리
0, // 플래그
1, // 입력 타입의 수
&mt, // 입력 타입의 배열
1, // 출력 타입의 수
&mt); // 출력 타입의 배열
if (FAILED(hr)) return hr;
// typelib 없음으로 개체를 등록한다.
return _Module.RegisterServer(FALSE);
}
이 예에서는, ATL 를 사용해 프로젝트가 생성 된 것으로 한다. 함수의 마지막 행에서는, 표준 ATL 메서드를 호출해, COM 서버를 등록하고 있다. ATL 를 사용하지 않는 경우, 함수는 다른 것이 된다.
DMO 의 등록의 해제
DllUnregisterServer 함수에서는,DllRegisterServer 함수로 생성 한 모든 레지스트리 엔트리를 삭제해야 한다. DMO 의 등록시에 DMORegister 를 호출하는 경우는, DMO 의 등록을 해제할 경우에도, 같은 카테고리로 DMOUnregister 를 호출할 필요가 있다.
다음의 예에서는, 전의 예로 생성 한 레지스트리 엔트리를 삭제하고 있다.
STDAPI DllUnregisterServer(void)
{
DMOUnregister(CLSID_MyDMO, DMOCATEGORY_AUDIO_EFFECT);
return _Module.UnregisterServer(TRUE);
}
DirectShow 의 메리트값
필터 그래프를 생성 하기 위해서, DirectShow 는 DMO 에 디폴트의 메리트값을 할당한다. 이 값을 오버라이드(override) 하려면 , HKEY_CLASSES_ROOT\CLSID 내의 DMO 의 레지스트리 키에, 레지스트리 엔트리를 추가한다. 메리트를 지정하는 값을 가지는 Merit 라는 이름의 DWORD 값을 인클루드 한다.