C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[17656] 이번에는 링커 에러???
heartsim [] 1881 읽음    2002-04-16 17:17
안녕하세요.heartsim(박경원)입니다.

위 질문에 대한 문제를 아직 해결을 못했군요. ^^;
음...일단 WM_GRAPHNOTIFY메세지 문제는 HandleGraphEvent();함수를 메세지 처리를 안 하고
직접 CaptureVideo()함수 안에 넣는 것으로 해보았습니다.(맨밑에 관련 소스가 있음)

그리고 FindCaptureDevice()함수 문제는 헤더에 #include "strmif.h" 파일을 첨가함으로서 해결을 한 것 같네요(정확히 맞는지는 모르겠음^^;)

그리고 나서 컴파일을 했더니 링커에러가 나더군요.다음과 같습니다.

Linker Error]Unresolved external _MEDIATYPE_Videoreferenced
from C:\PROGRAM FILES\BORLAND\CBUILDER5\TEST\DIRECTX8.1
\PLAYCAP\PLAYCAP.OBJ

[Linker Error]Unresolved external _PIN_CATEGORY_PREVIEW
referenced from C:\PROGRAM FILES\BORLAND\CBUILDER5
\TEST\DIRECTX8.1\PLAYCAP\PLAYCAP.OBJ

링커에러가 나길래 관련 라이브러리를 프로젝트에 추가를 해주었죠.
strmbase.lib(또는 strmbasd.lib), quartz.lib 등등

그런데, 역시 마찬가지고 링커에러가 나더군요.

이 일련의 디버깅 과정이 맞는지는 잘 모르겠으나,
만일 링커에러가 정확한 에러가 맞다면 관련 라이브러리를 추가해주면 되는데요..
그런데 모든 라이브러리를 추가해주었으나 역시 에러가 나는군요.@@;

한가지 유추를 하자면, 제 directx는 8.1입니다.
그리고 라이브러리 파일은 8.0입니다.(strmbase.lib or strmbasd.lib)
버전이 틀리면 라이브러리 파일을 같이 쓸수 없나요?

그리고 디렉트 엑스는 디버그 모드와 릴리스 모드가 있는데,
제 경우는 디버그 모드로 설치를 했습니다.
이 디버그 모드와 릴리스 모드 상태 차이 때문에 결과값이 다르게 나오는 걸가요?

해결이 되는 그 날까지~~~

HRESULT __fastcall TForm1::CaptureVideo(void)//비디오 캡쳐 그리고 프리뷰
{
        IBaseFilter *pSrcFilter;
        HRESULT hr;
        //Get Directshow interface
        hr=GetInterfaces();
        if(FAILED(hr))
        {
                 MessageBox(Form1->Handle,"Failed to get video interface"," Error Message",MB_OK);
                 return hr;
        }

        //Attach the filter graph to the capture graph
        hr=g_pCapture->SetFiltergraph(g_pGraph);
        if(FAILED(hr))
        {
                MessageBox(Handle,"Failed to set capture filter graph","Error Message",MB_OK);
                return hr;
        }

        //Use the system device enumerator and class enumerator to find
        //a video capture/ preview device, such as a desktop USB video camera.
        hr=FindCaptureDevice(&pSrcFilter);
        if(FAILED(hr))
        {
                //Dont display a message because FindCaptureDevice will handle it
                return hr;
        }
        //Add Capture filter to our graph.
        hr=g_pGraph->AddFilter(pSrcFilter,L"Video Capture");
        if(FAILED(hr))
        {
                MessageBox(Handle,"Couldnt add capture filter to graph !","AddFilter check",MB_OK);
                pSrcFilter->Release();
                return hr;
        }

        //Render the preview pin on the video capture filter
        //Use this instead of g_pGraph->RenderFile
        hr=g_pCapture->RenderStream(&PIN_CATEGORY_PREVIEW,&MEDIATYPE_Video,pSrcFilter,NULL,NULL);
        if(FAILED(hr))
        {
                MessageBox(Handle,"Couldnt render capture stream.","Render check",MB_OK);
                pSrcFilter->Release();
                return hr;
        }

        //Now that the filter has been added to the graph and we have
        //rendered its stream, we can release this reference to the filter.
        pSrcFilter->Release();

        //Set video window style and position
        hr=SetupVideoWindow();
        if(FAILED(hr))
        {
                MessageBox(Handle,"Couldnt initialize video window","Setup vedio window check",MB_OK);
                return hr;
        }

        //Add our graph to the running object table, which will allow
        //the GraphEdit application to "spy" on our graph
        #ifdef REGISTER_FILTERGRAPH
                hr=AddGraphToRot(g_pGraph,&g_dwGraphRegister);
                if(FAILED(hr))
                {
                        MessageBox(Handle,"Failed to register filter graph with ROT !","ROT check",MB_OK);
                        g_dwGraphRegister=0;
                }
        #endif

        //Start previewing video data
        hr=g_pMC->Run();
        if(FAILED(hr))
        {
                MessageBox(Handle,"Couldnt run the graph","RUN check",MB_OK);
                return hr;
        }


        HandleGraphEvent();

        //Remember current state
        g_psCurrent=Running;
        return S_OK;
}











heartsim 님이 쓰신 글 :
: 안녕하세요.heartsim(박경원)입니다.
: 오랜만에 글 올리네요.^^;
: Directshow의 playcap소스를 빌더(vcl)로 다시 작성해서 컴파일 했는데, 에러 두개가 뜨는군요.
: 하나는 WM_GRAPHNOTIFY가 undefined되었다고 하고,
: 나머지 하나는 FindCaptureDevice함수를 인식을 못하는군요.
:
: WM_GRAPHNOTIFY메세지 경우는 #define WM_GRAPHNOTIFY WM_APP+1로 정의해서 메세지 맵처리를 해줬습니다.
: 헌데 제가 잘못 했는지 undefined 되었다고 하오네요..@@;
: 혹 메세지 맵에서 메세지구조체를 잘못써줬나?^^;
:
: 그리고 FindCaptureDevice함수는 원문playcap소스의 FindCaptureDevice함수와 거의 비슷하게 코딩을 해줬는데,, 역시 에러가...나는군요.전혀 함수 인식을 못합니다.(다른 함수는 문제가 없는데)
:
: 혼자 해볼려고 했는데(5일째 고생중@@;) 도저히 안되서리...혹 이쪽분야로 아시는 분 있나해서
: 대략 글을 띄워봅니다.
: 혹 Directshow8.1하면서 유의해야 할 사항이나 더 추가해줘야 할 헤더 또는 라이브러리가 있지는 않은지.....고수님들의 답변 부탁드려요..
:
: 참고로 directx sdk8.1을 설치했고, 원문 vc++로 되어 있는것을 Vc++ Conversion Wizard를 이용해 bcb로 컨버전 해서 돌려봤습니다.
: 그런데 한가지 의문은 amcap은 컨버전으로 돌아가는데, playcap은 컨버전으로 컴파일 하면 에러가 나는군요.(그래서 bcb로 다시 작성했을때 에러가 나는건가???)
:
:

+ -

관련 글 리스트
17580 Directshow의 playcap를 c++builder5로 컴파일 중 에러?? heartsim 1077 2002/04/15
17656     이번에는 링커 에러??? heartsim 1881 2002/04/16
17716         @@맨땅에 헤딩은 넘 힘들어요...but success heartsim 1210 2002/04/17
18368                 안되시면...연락하세요^^; heartsim 1268 2002/05/10
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.