국내에서 발간된 DirectShow 개발 서적이라는 것이 신화선님의 ‘DirectShow 멀티미디어 프로그래밍’이 거의 유일한 책이라 요즘 이 책을 가지고서 DirectShow Filter 스터디를 하고 있다. 그런데 이 책이 출간되었을 당시의 개발 환경과는 너무 크게 바뀐 것이 요즘이라 (이 글도 나중에는 구식 방법이 되겠지만…) DirectShow Filter를 그냥 만들어 보는 것 조차도 겨우겨우…
나중에라도 혹시 까먹을까 봐 한번 작성해본다.
0. Visual Studio 옵션 설정
Visual Studio의 ‘도구’->’옵션’ 메뉴를 설정하여 ‘프로젝트 및 솔루션’->’VC++ 디렉터리’의 항목을 추가해야 한다.
Windows SDK가 설치 되어 있다면 ‘포함 파일(Include Files)’에 ‘$(WindowsSdkDir)\include’ 항목이 추가되어 있을 것이다. 이 항목만 가지고선 아래에 추가할 프로젝트가 Compile이 잘 되지 않는다. (왜? 잘 모르겠다. 아시는 분?) 그래서, 이 항목 위에 ‘$(WindowsSdkDir)\Samples\Multimedia\DirectShow\BaseClasses’를 추가한다. (반드시 ‘$(WindowsSdkDir)\include’ 항목 위에 추가해야 한다. 그래야 Compile이 된다.)
1. 프로젝트 생성
Visual Studio 2008에서 ‘Win32 프로젝트’로 새 프로젝트 ‘DShowFilter’를 생성한다.
2. 응용 프로그램 설정
Win32 응용 프로그램 마법사에서 응용 프로그램 종류를 ‘DLL’로, 추가 옵션을 ‘빈 프로젝트’로 설정한다.
3. BaseClasses(기반 클래스) 프로젝트 추가
물론 BaseClasses만 따로 Compile하고 그 결과인 strmbasd.lib, strmbase.lib만 사용할 수 있다. (MSDN에서는 그렇게 사용하라고 한다.) 하지만, 책에서 기반클래스를 포함하여 만들어 보라고 했으니까 그대로 따라 해 본다.
‘기존 프로젝트 추가’ 메뉴를 선택한 다음 Windows SDK 폴더 아래에 있는 BassClasses 프로젝트를 찾아서 추가한다. (..\Microsoft SDKs\Windows\v7.0\Samples\Multimedia\DirectShow\BaseClasses\baseclasses.vcproj)
4. 프로젝트 종속성 설정
DShowFilter 이전에 BaseClasses가 먼저 빌드 되어야 하므로 종속성 설정을 한다.
솔루션의 팝업 메뉴에서 ‘프로젝트 종속성’을 선택한다. (‘프로젝트 빌드 순서’를 선택해도 상관없다.)
‘종속성’ 탭에서 ‘DShowFilter’ 프로젝트를 ‘BaseClasses’에 종속시킨다. 이렇게 하면 자동으로 빌드 순서가 설정된다.
5. DShowFilter 프로젝트 속성 설정 (Debug 기준)
BaseClasses 프로젝트 속성은 별도로 수정할 필요가 없다.
DShowFilter 프로젝트 속성 창을 연다. ‘구성 속성’ 항목을 열어 아래 값들을 입력한다.
- ‘C/C++’->‘일반’->‘추가 포함 디렉터리’에 ‘.\BaseClasses’를 추가한다.
- ‘C/C++’->‘고급’->‘호출 규칙’을 ‘__stdcall (/Gz)’로 설정한다.
- ‘링커’->‘일반’->‘출력 파일’을 ‘$(OutDir)\$(ProjectName).ax’로 설정한다.
- ‘링커’->‘입력’->‘추가 종속성’에 ‘winmm.lib’, ‘..\BaseClasses\Debug\strmbasd.lib’, ‘msvrctd.lib’ 이 세 항목을 추가한다.
- ‘링커’->‘입력’->‘모든 기본 라이브러리 무시’를 ‘예(/NODEFAULTLIB)’로 한다.
- ‘링커’->‘입력’->‘모듈 정의 파일’에 ‘DShowFilter.def’를 추가한다.
- ‘링커’->‘시스템’->‘스택 예약 크기’와 ‘스택 커밋 크기’를 2097152(0x200000)로 한다. (이 항목은 아직 왜 하는지 모르겠다. 책이 그렇게 되어 있어서 그냥 한다.)
- ‘링커’->‘고급’ ->‘진입점’을 ‘DllEntryPoint@12’로 입력한다.
6. DShowFilter.def 파일 추가
DShowFilter 프로젝트에 ‘새 항목 추가’ 메뉴로 ‘모듈 정의 파일 (.def)’을 추가한다. 이름은 프로젝트 속성 설정 때 입력한 이름으로 설정한다. 아래 구문을 입력한다. (책 참고)
LIBRARY DShowFilter.ax
DESCRIPTION 'DirectShow Filter'
EXPORTS
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
Compile할 때 DESCRIPTION이라는 항목이 무시된다고 나와서 지워버렸다.
여기까지가 환경 설정이었다. 이제 책 내용대로 코드를 입력해보면 Filter 생성이 잘 된다!!!
