태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.
DirectShow 개발을 위해 참고한 책


저 책에 있는 내용을 개발해보려 하는데 도저히 VS.2005에서는 컴파일이 안되는 것입니다.
그래서 조금 검색을 해서 아래의 출처 사이트를 발견하게 되었고 다시 정리해 둡니다.
출처 : http://jaster.tistory.com/tag/filterDebug

XP와 VS.2005를 이용해서 DirectShow를 개발하기 위해서는 좀 복잡한 절차가 필요합니다.

운영체제 : MS Windows XP + SP3
IDE : MS Visual Studio .NET 2005 + SP1

SDK 설치

1. Windows SDK를 다운로드
http://www.microsoft.com/downloads/details.aspx?FamilyId=E6E1C3DF-A74F-4207-8586-711EBE331CDC&displaylang=en
위치가 이동되었다면 다운로드 센터에서 windows sdk로 검색해서 최신 버전을 선택하면 됩니다.
이글을 쓰는 시점에는 2008년 2월 5일 버전이 최신이군요.
'for Vista'나 'for Windows 2008'이라고 쓰여 있다고 해서 XP에서 쓸 수 없는 것이 아닙니다.

2. DirectX SDK를 다운로드
http://msdn.microsoft.com/en-us/directx/aa937788.aspx
위치가 이동되었다면 마찬가지로 다운로드 센터에서 directx sdk로 검색해서 최신 버전을 선택하면 됩니다.
이글을 쓰는 시점에는 2008년 11월 7일 버전이 최신입니다.

3. Windows SDK 설치
설치 할 때 "Windows Vista Headers and Libraries"를 필수적으로 설치해야 하고
다른 항목들은 필요에 따라 선택합니다. 전부 설치하면 2GB를 넘게 차지합니다.
DirectShow 관련 헤더파일이 "Vista Headers"에 있습니다.

4. DirectX SDK 설치
그냥 단순하게 풀로 설치합니다. DirectShow가 드로잉할 때 DirectDraw가 필요한데 이 헤더와 라이브러리가 DirectX SDK에 있습니다. 그러니까 필수 요소입니다.

5. 설치 위치 확인
특별히 따로 지정하지 않았다면 아래의 폴더에 설치되어 있을 것입니다.
C:\Program Files\Microsoft SDKs\Windows
C:\Program Files\Microsoft DirectX SDK (November 2008)

VS.2005 설정

1. VC++ 디렉토리 설정
도구 -> 옵션 (Tools -> Options) 메뉴를 실행합니다.
프로젝트 및 솔루션 -> VC++ 디렉터리 항목을 선택합니다.


앞으로 입력되는 디렉터리는 SDK가 설치된 디렉터리를 기준으로 입력하는 것입니다.
다른 위치에 설치했다면 그에 맞게 바꿔서 입력해야 합니다.

'다음 파일의 디렉터리 표시'에서 '실행 파일'을 선택하고 다음 디렉터리들을 순서대로 입력합니다.
  1. C:\Program Files\Microsoft SDKs\Windows\v6.0\Bin
  2. C:\Program Files\Microsoft DirectX SDK (November 2008)\Developer Runtime\x86
'다음 파일의 디렉터리 표시'에서 '포함 파일'을 선택하고 다음 디렉터리들을 순서대로 입력합니다.
  1. C:\Program Files\Microsoft SDKs\Windows\v6.0\Samples\Multimedia\DirectShow\BaseClasses
  2. C:\Program Files\Microsoft DirectX SDK (November 2008)\Include
  3. C:\Program Files\Microsoft SDKs\Windows\v6.0\Include
'다음 파일의 디렉터리 표시'에서 '라이브러리 파일'을 선택하고 다음 디렉터리들을 순서대로 입력합니다.
  1. C:\Program Files\Microsoft SDKs\Windows\v6.0\Lib
  2. C:\Program Files\Microsoft DirectX SDK (November 2008)\Lib\x86
디렉터리는 최상단에서부터 순서대로 입력되어야합니다.
우측 상단의 화살표 버튼을 사용해서 순서를 조절할 수 있습니다.

2. 기본 클래스 컴파일
지금 상태에서 컴파일하면 다음과 같은 종류의 링크 에러를 보게 됩니다.
1>main.obj : error LNK2001: unresolved external symbol _IID_IMediaEvent 1>main.obj : error LNK2001: unresolved external symbol _IID_IMediaControl 1>main.obj : error LNK2001: unresolved external symbol _CLSID_FilterGraph 1>main.obj : error LNK2001: unresolved external symbol _IID_IGraphBuilder 미리 정의된 심볼이 링크되지 않아서 그런 것인데..
해결을 위해서 BaseClasses라는 DirectShow 샘플을 컴파일해야 합니다.
아래의 위치에 있는 솔루션을 읽어서 Debug와 Release 모두 컴파일을 합니다.
...Microsoft SDKs\Windows\v6.0\Samples\Multimedia\DirectShow\BaseClasses

그러면 Debug 폴더에는 strmbasd.lib 파일이 Release 폴더에는 strmbase.lib 파일이 생성되는데
   
   

이 파일들을 C:\Program Files\Microsoft SDKs\Windows\v6.0\Lib 폴더에 복사합니다.
(복사하지 않고 그냥 해당 디렉토리들을 '라이브러리 파일' 디렉토리에 추가해도 됩니다.)

DirectShow 개발시에 추가 해줘야 할 것들

1. 베이스 클래스를 링크할 수 있게 stdafx.h에 코드 추가
// DirectShow 라이브러리 연결 #include <streams.h> #include <dshow.h> #ifdef _DEBUG #pragma comment(lib, "strmbasd") #else #pragma comment(lib, "strmbase") #endif

2. 컴파일시 "dxtrans.h" 파일을 찾을 수 없다고 할 경우 해결법
qedit.h 파일에서 dxtrans.h 헤더를 인클루드한 줄을 찾아서 주석 처리하고 저장합니다.
//#include "dxtrans.h"
그리고 프로젝트의 stdafx.h 헤더 파일에 아래의 코드를 추가합니다.
// dxtrans.h 문제 해결 #define __IDxtCompositor_INTERFACE_DEFINED__ #define __IDxtAlphaSetter_INTERFACE_DEFINED__ #define __IDxtJpeg_INTERFACE_DEFINED__ #define __IDxtKey_INTERFACE_DEFINED__ #include <qedit.h>
3. 간편한 매크로 사용
아래의 매크로를 사용하면 코드를 간략하게 나타낼 수도 있습니다.
#define SAFE_RELEASE(x) { if (x) x->Release(); x = NULL; } #define JIF(x) { HRESULT hr; if (FAILED(hr=(x))) { TRACE("FAILED (hr=0x%X) in "#x"\n", hr); return hr; } } #define QIF(x) { HRESULT hr; if (FAILED(hr=(x))) { TRACE("FAILED (hr=0x%X) in "#x"\n", hr); return; } } #define LIF(x) { HRESULT hr; if (FAILED(hr=(x))) { TRACE("FAILED (hr=0x%X) in "#x"\n", hr); } }

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License

댓글을 달아 주세요

  1. 최원석 2008/12/03 20:04   댓글주소   댓글쓰기   수정/삭제

    저도 많이 고생하고 해메고 있었는데;;;
    이렇게 좋은 자료를 만들어주시니 감사할 따름입니다 ㅎ

  2. Favicon of http://darkblitz.tistory.com BlogIcon darkblitz 2008/12/04 22:06   댓글주소   댓글쓰기   수정/삭제

    커흥... 저거 저도 옛날에 정리해놨을텐데... 작년 말인가 올해 초던가...
    물론 좀 허접하게 해놨지만 -_-a
    좀 더 편하게 하시려면, DirectX SDK를 구버전, 2007년 8월 버전을 쓰시면 됩니다. -_-a

  3. 최원석 2008/12/07 16:21   댓글주소   댓글쓰기   수정/삭제

    예; 그래서 제 컴퓨터에는 SDK가 3개가 깔려있지요-_-;;

  4. Favicon of http://cafe.naver.com/kcodeguru/881 BlogIcon 케코지기 2008/12/10 13:48   댓글주소   댓글쓰기   수정/삭제

    정말 막막했는데 감사합니다.
    제까페에 퍼갔습니다.
    사실 window mobile용 필터를 만들어야 하는데 막막합니다. ㅠㅠ 어째야 되는지 깡통 , 무식쟁인데 ㅠㅠ

  5. 엄태준 2009/01/29 23:43   댓글주소   댓글쓰기   수정/삭제

    좋은 자료 감사합니다.
    퍼갈께요.

  6. 꼼아 2009/02/03 21:12   댓글주소   댓글쓰기   수정/삭제

    좋은 자료 감사합니다~ 저도 퍼갈게요~

  7. 김성태 2009/03/06 17:43   댓글주소   댓글쓰기   수정/삭제

    굿잡입니다..

  8. 찐스 2009/07/27 17:36   댓글주소   댓글쓰기   수정/삭제

    따라해보고.. 질문이 있는데요..
    BaseClasses 솔루션을 컴파일하는데 에러가 납니다..크게 두가지로..

    1. c:\program files\microsoft sdks\windows\v6.1\include\intsafe.h(116) : warning C4005: 'SUCCEEDED' : 매크로 재정의
    c:\program files\microsoft visual studio 8\vc\platformsdk\include\winerror.h(17103) : 'SUCCEEDED'의 이전 정의를 참조하십시오.

    2. c:\program files\microsoft sdks\windows\v6.1\include\intsafe.h(320) : error C2061: 구문 오류 : 식별자 '__deref_out_range'

    에서 계속 오류가 납니다..

    • Favicon of http://blog.tinywolf.com BlogIcon |꼬마늑대| 2009/07/29 06:04   댓글주소   수정/삭제

      디렉토리를 추가할 때 최상단으로 순서를 맞춰서 해야 합니다.
      디렉토리 순서를 한번 확인해 보시구요.
      확인해도 이상이 없다면 소스를 편집해서 include 순서를 한번 바꿔보십시오.

  9. ;ㅅ;.. 2010/03/13 14:10   댓글주소   댓글쓰기   수정/삭제

    질문이 있는데요;;
    베이스 클래스 라이브러리는 전부 컴파일해서 추가해줬는데..;

    C:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\Multimedia\DirectShow\BaseClasses\refclock.h(80) : error C2061: 구문 오류 : 식별자 'CAMSchedule'
    C:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\Multimedia\DirectShow\BaseClasses\refclock.h(139) : error C2143: 구문 오류 : ';'이(가) '*' 앞에 없습니다.
    C:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\Multimedia\DirectShow\BaseClasses\refclock.h(139) : error C4430: 형식 지정자가 없습니다. int로 가정합니다. 참고: C++에서는 기본 int를 지원하지 않습니다.
    C:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\Multimedia\DirectShow\BaseClasses\refclock.h(139) : error C4430: 형식 지정자가 없습니다. int로 가정합니다. 참고: C++에서는 기본 int를 지원하지 않습니다.
    C:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\Multimedia\DirectShow\BaseClasses\refclock.h(139) : warning C4183: 'GetSchedule': 반환 형식이 없습니다. 'int'를 반환하는 멤버 함수로 간주됩니다.
    C:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\Multimedia\DirectShow\BaseClasses\refclock.h(178) : error C2143: 구문 오류 : ';'이(가) '*' 앞에 없습니다.
    C:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\Multimedia\DirectShow\BaseClasses\refclock.h(178) : error C4430: 형식 지정자가 없습니다. int로 가정합니다. 참고: C++에서는 기본 int를 지원하지 않습니다.
    C:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\Multimedia\DirectShow\BaseClasses\refclock.h(178) : error C4430: 형식 지정자가 없습니다. int로 가정합니다. 참고: C++에서는 기본 int를 지원하지 않습니다.
    C:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\Multimedia\DirectShow\BaseClasses\refclock.h(139) : error C2065: 'm_pSchedule' : 선언되지 않은 식별자입니다.
    C:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\Multimedia\DirectShow\BaseClasses\refclock.h(166) : error C2065: 'm_pSchedule' : 선언되지 않은 식별자입니다.
    C:\Program Files\Microsoft SDKs\Windows\v6.1\Samples\Multimedia\DirectShow\BaseClasses\refclock.h(166) : error C2227: '->GetEvent' 왼쪽은 클래스/구조체/공용 구조체/제네릭 형식을 가리켜야 합니다.
    ''unknown-type'' 형식입니다.

    라는군요;;

    • Favicon of http://blog.tinywolf.com BlogIcon |꼬마늑대| 2010/03/15 09:41   댓글주소   수정/삭제

      'CAMSchedule'이 어디에 선언되어 있는지 찾아서 include해주면 될 것같네요.
      혹시 DirectShow의 내용이 또 바꼈을지도 모르구요.
      위의 내용은 특정 버전에서만 성공한 내용이라서..

  10. seobros 2010/08/03 17:43   댓글주소   댓글쓰기   수정/삭제

    C:\Program Files\Microsoft SDKs\Windows\v6.1\Include\qedit.h(498) : fatal error C1083: 포함 파일을 열 수 없습니다. 'dxtrans.h': No such file or directory 와 같은 오류가 뜨는 경우..

    #include <qedit.h> 의 앞쪽에 아래의 내용을 추가해 주면 해결 됩니다.

    #pragma include_alias( "dxtrans.h", "qedit.h" )
    #define __IDxtCompositor_INTERFACE_DEFINED__
    #define __IDxtAlphaSetter_INTERFACE_DEFINED__
    #define __IDxtJpeg_INTERFACE_DEFINED__
    #define __IDxtKey_INTERFACE_DEFINED__
    #include <qedit.h>

    좋은 정보 얻고 갑니다..

  11. activeho 2010/12/09 09:54   댓글주소   댓글쓰기   수정/삭제

    감사합니다. 좋은정보 유용하게 활용했습니다.

 체크하면 블로그 관리자에게만 내용을 공개합니다.