2014년 3월 9일 일요일

visual studio 6.0으로 directshow 프로그래밍 문제점들

http://www.nohungry.net/tt1/84

참고로 Visual Studio .Net 2005 를 깔아도 똑같은 문제가 발생할 경우가 있는데
Visual Studio .Net 2003 폴더의 내용을 참조하는게 있었다.
(6) strmiids.lib(strmiids.obj) : fatal error LNK1103: debugging information corrupt; recompile module
오류 메세지는 좀 틀렸지만 어쨌든 같은 파일에서 에러가 나면서 2003의 폴더를 참조하더라.
결국 Visual Studio .Net 2003 을 깔아주니 해결되었다.

결론: Visual Studio .Net 2003을 깔고 2005를 깔아줍시다. 그럼 문제없음.

근 이번 주 초부터 DirectShow 때문에 머리에 쥐가 내렸다.
첨에 아무 생각없이 Visual Studio 2005를 기반으로 DirectShow 일을 진행했다.

#1. 왜 내 허락도 없이 그랬니?
첨엔 Visual Studio 2005를 기반으로 DirectShow 프로그래밍을 했다.
분명, 내 기억이 맞다면, DirectShow로 프로그래밍을 하려면.. DirectX SDK를 깔면 되었는데...
DirectX SDK 9.0c를 깔았음에도 불구하고.. Compile 조차 안되는게 아닌가?!!!!

첨엔 DirectX를 지우고 다시 깔아도 봤다.. 그런데 알고보니...
DirectX SDK 8.1 이후 버젼부터는 DirectShow SDK가 Microsoft Platform SDK로 포함되었단다..
"왜!! 내 허락도 없이 그냥 바꾸냐고!!!"

교훈: 항상 최신 정보에 익숙하도록 하자.. 그러나, 그러기엔 최신 정보는 너무나 빨리 쏟아진다.

#2. 왜왜왜!!!!
한참 Visual Studio 2005에서 지시 받은 대로 DirectShow Wrapper Library를 구현하고 있었다.
부장님 왈, "Visual Studio 6.0에 Compatible하게 맹글어."
"헉!!!!-ㅁ-"..

지금까지 하던 모든 행위들을 접고... 다시 시작했다.
Visual Studio 6.0으로 예제프로그램부터 돌려봤다. 아.. 아니나다를까 무수하게 쏟아지는... 컴파일
에러들.. 분명! 2005랑 똑같은 헤더 파일들을 include하고 Lib 파일들을 link 했음에도...ㅠㅠ

#3. 나를 위한 해결책들... 그리고 누군가를 위해서도...
예전에 내가 포스팅해둔 C#에서 Cross Thread 문제를 해결하는 방법을.. 그 후로 5개월 가량 지난 시점에서 내가 다시 만나게 되었다. 그러나.. 나의 이 한심한 기억 용량은 해결책을 이미 지워버린지 오래였다. 난 그 때 내가 그 때의 귀차니즘을 이겨내고 포스팅을 해둔 내가 얼마나 고마웠는지 모른다.

그래서 지금 이렇게 해결책을 다시금 쓴다.

(1) Tools - Option - Directory - Include에 젤 상위부터...DirectX SDK의 include 경로, Platform SDK의 include 경로, Platform SDK의 Common 경로, Platform SDK의 Baseclass 경로를 추가한다. 그 이후에 원래부터 있던 include 경로들을 써준다. 꼭꼭!
(주: Platform SDK의 Common과 Baseclass의 경로는 Platform SDK의 버젼마다 조금씩 다르겠지만, Samples - Multimedia - DirectShow 아래에 존재한다. 참고로 난 Microsoft Platform SDK for Windows Server 2003 R2 버젼을 사용했다. Windows Server 2003 R2라고 하지만 XP Professional에서도 잘 돌아간다.)

(2) Tools - Option - Directory - Lib에 젤 상위부터...DirectX SDK의 Lib 경로, Platform SDK의 Lib 경로를 추가해준다.

(3) 추가해야할 Include 파일들...
필히 다음과 같은 순서대로 Include 하자.
atlbase.h, windows.h, dshow.h, strsafe.h, iostream.h : 참고로 이 헤더 파일 순서는 DirectShow Sample들 중 PlayCap을 기준으로 쓴 것이다. 하지만, 대략 위와 같은 순서가 맞다.

(4) 추가해야할 Lib 파일들...
잡다한 것은 지워도 좋다.
하지만 필히 다음과 같은 순서대로.. "strmiids.h, strmbase.lib, ole32.lib, uuid.lib, gdi32.lib"

(5) CoInitializeEX Error 문제는...
Project - Setting - C/C++ - Prepeocessor Definitions에 _WIN32_DCOM를 추가해주면 해결 가능하다.

(6) strmiids.lib(strmiids.obj) : fatal error LNK1103: debugging information corrupt; recompile module이 문제는 사실 상 6.0에선 해결이 불가능하다고 한다. 뭐 꼼수가 있다고 하는데.. 매우 복잡한 관계로 해결이 힘들고, 이는 Visual Studio 7.0 이상.. (다시말하면 Visual Studio .NET 2003 이상)에선 괜찮다고 한다.

해결방법은.. Release 모드로 하면 된다는 것.. Debugging 하기 힘들다는 단점이 있지만.. 어쩔 수 없지 않은가...-ㅁ-

(7) 추가적인 문제...
Visual Studio 6.0에서 DWORD_PTR, LONG_PTR과 같은 타입을 찾을 수 없다고 나올 때.. 에러나는 헤더 파일을 열어 각각을 DWORD*, LONG* 로 바꾼 후, 저장하면 해결된다.-ㅁ-;;

댓글 없음:

댓글 쓰기