Visual Studio 2005 에서 DirectShow Filter 제작.. test 1
일단 DirectShow가 요즘은 DirectX SDK에 포함되어 있지 않고 Platform SDK에 포함되서 나온다.
마이크로소프트 가서 Platform SDK를 설치하면 된다.
Visual Studio 2005에서 프로젝트를 생성하는데 Win32 DLL로 생성하면 된다. Filter 자체가 Win32 DLL이라고 한다.
책에선..
책은 일단 DirectShow 멀티미디어 프로그래밍(신화선님)을 참고 했다. 책은 Visual Studio 6를 중심으로 되어있으며
처음부분에만 어떻게 만드는지 쓰여있고 그뒤로는 계속 템플릿을 사용하여 자동으로 소스를 생성하기 때문에 처음에
잘 해놓지 않으면 아무것도 모른채 진행되게 된다. 물론 2005 사용자는 그것도 안되서 스스로 해야한다.
2005에서 필터를 제작하면서 아예 처음부터 하면서 문제가 생겼던 부분을 해결하면서 그 내용들을 써놓는 것이
나중이나 처음해보는 사람한테는 도움이 더 될듯하다..^^
아무튼.. win32 dll로 프로젝트를 생성했으면
솔루션에 프로젝트를 추가하여 BaseClasses를 추가해 줘야한다.
C:\Program Files\Microsoft Platform SDK\Samples\Multimedia\DirectShow\BaseClasses
위의 위치에 BaseClasses가 들어있다. 책과는 달리 기본 프로젝트가 생성이 되어있지는 않다.
make 파일이 존재하긴 하는데 어떻게 사용하는지 모르겟다.. -0-;;
static dll로 프로젝트를 만들어서 output이 strmbasd.lib 가 되게 하면 되는 듯 하다. 나름대로 해보길….
일단 baseclasses 프로젝트를 테스트필터 프로젝트로 불러들여왔으면
필터 프로젝트의 dependencies를 설정한다. 당연하겠죠 baseclasses가 먼저 빌드되어야 그 lib를 가져다가 필터를 만들테니..;;
#include <InitGuid.h>
#include “streams.h”
헤더를 포함시키고
stdafx.h와 같은 헤더파일이나 아니면 필터의 common 헤더파일같은 곳에
GUID를 생성해서 넣어줘야 한다.
Visual Studio 메뉴의 Tools/Create GUID 에서 DEFINE_GUID를 선택해서
guid 생성하여 복사해서 넣고 guid의 이름을 넣어준다.
guid변수 관련 link에러가 나면 <InitGuid.h> 헤더파일이 제대로 포함되었는지 확인해 봐야한다.
Project Setting에서
– Output file => debug/Text2RGB.ax 와 같이 설정
– Input => strmbasd.lib winmm.lib strmiids.lib
– additional include => baseclasses
– advanced calling convention => __stdcall
– input => module definition fil => Text2RGB.def
과 같이 설정
Text2RGB.def 파일은
LIBRARY DShowFilter.ax
EXPORTS
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
이렇게 쓰고 텍스트 파일로 저장한다.
필터이름은 나름대로 설정하시길… 책에 나온대로 일단 썼음
def 파일은 input의 module definition file에서 꼭 해줘야한다.
안하면 필터가 보이지도 않을뿐더러 제거할경우 OCX나 DLL이 아닌것 같습니다. ?? 와 비슷한 에러가 발생한다.
필터의 메인 소스부분에
CFactoryTemplate g_Templates[];
int g_cTemplates;
위의 두 변수를 책에서 처럼 설정해 줘야 한다.
두변수를 baseclasses에서 extern 으로 바로 참조하므로 없으면 에러가 발생한다.
책에서는 DllMain을 없애고 프로젝트 셋팅에서 DllEntry를 설정하도록 나오는데
에러가 발생해서 다음과 같이 해줬다. 2005 필터 샘플에서 가져왔다.
// The StrmBase.Lib Entrypoint.
extern “C” BOOL WINAPI DllEntryPoint(HINSTANCE, ULONG, LPVOID);
BOOL WINAPI DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved)
{
return DllEntryPoint(reinterpret_cast<HINSTANCE>(hDllHandle), dwReason, lpreserved);
}
// DllRegisterSever
// Handle the registration of this filter
STDAPI DllRegisterServer()
{
return(AMovieDllRegisterServer2(TRUE));
}
// DllUnregsiterServer
STDAPI DllUnregisterServer()
{
return(AMovieDllRegisterServer2(FALSE));
}
Filter 등록은 regsvr32 /s /c DShowFilter.ax
등록해지는 regsvr32 /v /u DShowFilter.ax
으로 한다.