본문 바로가기
IT창고/DirectShow

Dshow API -> MFC 포팅..!

by 창구창고 2007. 1. 23.

📑 목차

    반응형

    //------------------------------------------------------------------------------
    // File: Auxiliary.cpp
    //
    // Desc: Useful auxiliaries for the Win32 Application.
    //
    // Copyright (c) 2000 - 2005, L544™ Technology.  All rights reserved.
    //------------------------------------------------------------------------------

    #include "stdafx.h"

    #ifdef _DEBUG

    #include <stdio.h>

    /*

    void TRACE(LPCTSTR lpszFormat, ...)
    {

        va_list args ;
        va_start(args, lpszFormat) ;

     int nBuf ;
        TCHAR szBuffer[1024] ;  // Large buffer for very long filenames (like with HTTP)

     nBuf = vsprintf(szBuffer, lpszFormat, args) ;

     // was there an error? was the expanded string too long?
     assert(nBuf >= 0) ;

     OutputDebugString(szBuffer) ;
    // MessageBox(NULL, szBuffer, "DirectShow", MB_OK) ;

        va_end(args) ;
    }

    */

    #else

    void TRACE(LPCTSTR lpszFormat, ...)
    {
     // TODO: Place code here.
    }

    #endif

    // An application can advertise the existence of its filter graph
    // by registering the graph with a global Running Object Table (ROT).
    // The GraphEdit application can detect and remotely view the running
    // filter graph, allowing you to 'spy' on the graph with GraphEdit.
    //
    // To enable registration in this sample, define REGISTER_FILTERGRAPH.
    //

    #ifdef REGISTER_FILTERGRAPH

    HRESULT AddGraphToRot(IUnknown *pUnkGraph, DWORD *pdwRegister)
    {
        IMoniker * pMoniker;
        IRunningObjectTable *pROT;
        if (FAILED(GetRunningObjectTable(0, &pROT))) {
            return E_FAIL;
        }
        WCHAR wsz[128];
        wsprintfW(wsz, L"FilterGraph %08x pid %08x", (DWORD_PTR)pUnkGraph, GetCurrentProcessId());
        HRESULT hr = CreateItemMoniker(L"!", wsz, &pMoniker);
        if (SUCCEEDED(hr)) {
            hr = pROT->Register(0, pUnkGraph, pMoniker, pdwRegister);
            pMoniker->Release();
        }
        pROT->Release();
        return hr;
    }

    void RemoveGraphFromRot(DWORD pdwRegister)
    {
        IRunningObjectTable *pROT;
        if (SUCCEEDED(GetRunningObjectTable(0, &pROT))) {
            pROT->Revoke(pdwRegister);
            pROT->Release();
        }
    }

    #endif








    // MainFrm.cpp : CMainFrame 클래스의 구현
    //

    #include "stdafx.h"
    #include "MFCporting.h"

    #include "MainFrm.h"

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif


    // CMainFrame

    IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)

    BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
     ON_WM_CREATE()
    END_MESSAGE_MAP()


    // CMainFrame 생성/소멸

    CMainFrame::CMainFrame()
    {
     // TODO: 여기에 멤버 초기화 코드를 추가합니다.
    }

    CMainFrame::~CMainFrame()
    {
    }


    int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
    {
     if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
      return -1;
     
     if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
      | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||
      !m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
     {
      TRACE0("도구 모음을 만들지 못했습니다.\n");
      return -1;      // 만들지 못했습니다.
     }

     // TODO: 도구 모음을 도킹할 수 없게 하려면 이 세 줄을 삭제하십시오.
     m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
     EnableDocking(CBRS_ALIGN_ANY);
     DockControlBar(&m_wndToolBar);

     return 0;
    }

    BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
    {
     if( !CFrameWnd::PreCreateWindow(cs) )
      return FALSE;
     // TODO: CREATESTRUCT cs를 수정하여 여기에서
     //  Window 클래스 또는 스타일을 수정합니다.

     cs.style = WS_OVERLAPPED | WS_CAPTION | FWS_ADDTOTITLE
       | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU;

     return TRUE;
    }


    // CMainFrame 진단

    #ifdef _DEBUG
    void CMainFrame::AssertValid() const
    {
     CFrameWnd::AssertValid();
    }

    void CMainFrame::Dump(CDumpContext& dc) const
    {
     CFrameWnd::Dump(dc);
    }

    #endif //_DEBUG


    // CMainFrame 메시지 처리기





    // MFCporting.cpp : 응용 프로그램에 대한 클래스 동작을 정의합니다.
    //

    #pragma comment(lib, TEXT("comctl32.lib"))

    #include "stdafx.h"
    #include "MFCporting.h"
    #include "MainFrm.h"

    #include "MFCportingDoc.h"
    #include "MFCportingView.h"

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif

    #include <commctrl.h>
    #include <commdlg.h>


    //------------------------------------------------------------------------------
    // Type Definitions
    //------------------------------------------------------------------------------

    typedef UINT (CALLBACK* PFNDLL_STES)(UINT);

    // File filter for OpenFile dialog
    #define FILE_FILTER_TEXT \
     TEXT("Video Files (AVI,ASF,MPEG,Indeo,QuickTime)\0*.avi;*.asf;*.wmv;*.mpg;*.mpe*;*.mp1*;*.mp2*;*.mpv*;*.ivf;*.qt\0")\
     TEXT("Audio files (WAV,WMA,MPEG,MIDI,AIFF,AU,SND)\0*.wav;*.wma;*.mp3;*.mpa;*.mid*;*.rmi;*.aif*;*.au;*.snd\0")\
     TEXT("All Files (*.*)\0*.*;\0\0")

    // Begin default media search at root directory
    #define DEFAULT_MEDIA_PATH  TEXT("\\\0")


    // CMFCportingApp

    BEGIN_MESSAGE_MAP(CMFCportingApp, CWinApp)
     // ON_COMMAND(ID_APP_ABOUT, &CMFCportingApp::OnAppAbout)
     // 표준 파일을 기초로 하는 문서 명령입니다.

     // 표준 인쇄 설정 명령입니다.


    END_MESSAGE_MAP()


    // CMFCportingApp 생성

    CMFCportingApp::CMFCportingApp()

    {
     // TODO: 여기에 생성 코드를 추가합니다.
     // InitInstance에 모든 중요한 초기화 작업을 배치합니다.
     
    }


    CMFCportingApp::~CMFCportingApp()
    {
     
    }
    // 유일한 CMFCportingApp 개체입니다.

    CMFCportingApp theApp;


    // CMFCportingApp 초기화

    BOOL CMFCportingApp::InitInstance()
    {
     // 응용 프로그램 매니페스트가 ComCtl32.dll 버전 6 이상을 사용하여 비주얼 스타일을
     // 사용하도록 지정하는 경우, Windows XP 상에서 반드시 InitCommonControlsEx()가 필요합니다.
     // InitCommonControlsEx()를 사용하지 않으면 창을 만들 수 없습니다.
     INITCOMMONCONTROLSEX InitCtrls;
     InitCtrls.dwSize = sizeof(InitCtrls);
     // 응용 프로그램에서 사용할 모든 공용 컨트롤 클래스를 포함하도록
     // 이 항목을 설정하십시오.
     InitCtrls.dwICC = ICC_WIN95_CLASSES;
     InitCommonControlsEx(&InitCtrls);

     CWinApp::InitInstance();

     // OLE 라이브러리를 초기화합니다.
     if (!AfxOleInit())
     {
      AfxMessageBox(IDP_OLE_INIT_FAILED);
      return FALSE;
     }
     AfxEnableControlContainer();
     // 표준 초기화
     // 이들 기능을 사용하지 않고 최종 실행 파일의 크기를 줄이려면
     // 아래에서 필요 없는 특정 초기화
     // 루틴을 제거해야 합니다.
     // 해당 설정이 저장된 레지스트리 키를 변경하십시오.
     // TODO: 이 문자열을 회사 또는 조직의 이름과 같은
     // 적절한 내용으로 수정해야 합니다.
     SetRegistryKey(_T("로컬 응용 프로그램 마법사에서 생성된 응용 프로그램"));
     LoadStdProfileSettings(4);  // MRU를 포함하여 표준 INI 파일 옵션을 로드합니다.
     // 응용 프로그램의 문서 템플릿을 등록합니다. 문서 템플릿은
     //  문서, 프레임 창 및 뷰 사이의 연결 역할을 합니다.
     CSingleDocTemplate* pDocTemplate;
     pDocTemplate = new CSingleDocTemplate(
      IDR_MAINFRAME,
      RUNTIME_CLASS(CMFCportingDoc),
      RUNTIME_CLASS(CMainFrame),       // 주 SDI 프레임 창입니다.
      RUNTIME_CLASS(CMFCportingView));
     if (!pDocTemplate)
      return FALSE;
     AddDocTemplate(pDocTemplate);


     // 표준 셸 명령, DDE, 파일 열기에 대한 명령줄을 구문 분석합니다.
     CCommandLineInfo cmdInfo;
     ParseCommandLine(cmdInfo);


     // 명령줄에 지정된 명령을 디스패치합니다.
     // 응용 프로그램이 /RegServer, /Register, /Unregserver 또는 /Unregister로 시작된 경우 FALSE를 반환합니다.
     if (!ProcessShellCommand(cmdInfo))
      return FALSE;

     // 창 하나만 초기화되었으므로 이를 표시하고 업데이트합니다.
     m_pMainWnd->ShowWindow(SW_SHOW);
     m_pMainWnd->UpdateWindow();
     // 접미사가 있을 경우에만 DragAcceptFiles를 호출합니다.
     //  SDI 응용 프로그램에서는 ProcessShellCommand 후에 이러한 호출이 발생해야 합니다.
     return TRUE;
    }


    // 응용 프로그램 정보에 사용되는 CAboutDlg 대화 상자입니다.

    class CAboutDlg : public CDialog
    {
    public:
     CAboutDlg();

     // 대화 상자 데이터입니다.
     enum { IDD = IDD_ABOUTBOX };

    protected:
     virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 지원입니다.

     // 구현입니다.
    protected:
     DECLARE_MESSAGE_MAP()
    };

    CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
    {
    }

    void CAboutDlg::DoDataExchange(CDataExchange* pDX)
    {
     CDialog::DoDataExchange(pDX);
    }

    BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    END_MESSAGE_MAP()

    // 대화 상자를 실행하기 위한 응용 프로그램 명령입니다.
    void CMFCportingApp::OnAppAbout()
    {
     CAboutDlg aboutDlg;
     aboutDlg.DoModal();
    }


    // CMFCportingApp 메시지 처리기




    // MFCportingDoc.cpp : CMFCportingDoc 클래스의 구현
    //

    #include "stdafx.h"
    #include "MFCporting.h"

    #include "MFCportingDoc.h"

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif


    // CMFCportingDoc

    IMPLEMENT_DYNCREATE(CMFCportingDoc, CDocument)

    BEGIN_MESSAGE_MAP(CMFCportingDoc, CDocument)
    END_MESSAGE_MAP()


    // CMFCportingDoc 생성/소멸

    CMFCportingDoc::CMFCportingDoc()
    {
     // TODO: 여기에 일회성 생성 코드를 추가합니다.

    }

    CMFCportingDoc::~CMFCportingDoc()
    {
    }

    BOOL CMFCportingDoc::OnNewDocument()
    {
     if (!CDocument::OnNewDocument())
      return FALSE;

     // TODO: 여기에 재초기화 코드를 추가합니다.
     // SDI 문서는 이 문서를 다시 사용합니다.

     return TRUE;
    }



    // CMFCportingDoc serialization

    void CMFCportingDoc::Serialize(CArchive& ar)
    {
     if (ar.IsStoring())
     {
      // TODO: 여기에 저장 코드를 추가합니다.
     }
     else
     {
      // TODO: 여기에 로딩 코드를 추가합니다.
     }
    }


    // CMFCportingDoc 진단

    #ifdef _DEBUG
    void CMFCportingDoc::AssertValid() const
    {
     CDocument::AssertValid();
    }

    void CMFCportingDoc::Dump(CDumpContext& dc) const
    {
     CDocument::Dump(dc);
    }
    #endif //_DEBUG


    // CMFCportingDoc 명령



    // MFCportingView.cpp : CMFCportingView 클래스의 구현
    //

    #include "stdafx.h"
    #include "MFCporting.h"

    #include "MFCportingDoc.h"
    #include "MFCportingView.h"

    #ifdef _DEBUG
    #define new DEBUG_NEW
    #endif


    // CMFCportingView

    IMPLEMENT_DYNCREATE(CMFCportingView, CView)

    BEGIN_MESSAGE_MAP(CMFCportingView, CView)
     // 표준 인쇄 명령입니다.
     ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)
     ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
     ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)
     
     //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
     //도구 툴바 수행 메시지맵..
     ON_COMMAND(ID_FILE_PLAY, &CMFCportingView::OnFilePlay)
     ON_COMMAND(ID_FILE_PAUSE, &CMFCportingView::OnFilePause)
     ON_COMMAND(ID_FILE_STOP, &CMFCportingView::OnFileStop)
     ON_COMMAND(ID_FILE_OPEN, &CMFCportingView::OnFileOpen)
     ON_COMMAND(ID_FILE_NEW, &CMFCportingView::OnFileNew)
     //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

     ON_WM_PAINT()
     ON_WM_KEYUP()
     ON_WM_SIZE()
     ON_WM_DESTROY()

    END_MESSAGE_MAP()

    // CMFCportingView 생성/소멸

    CMFCportingView::CMFCportingView():
    m_pGB(NULL)
    {
     // TODO: 여기에 생성 코드를 추가합니다.
     //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
     // component 초기화
     CoInitialize(NULL);
     //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    }

    CMFCportingView::~CMFCportingView()
    {

     //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
     //component 소멸
     CoUninitialize() ;
     //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    }

    BOOL CMFCportingView::PreCreateWindow(CREATESTRUCT& cs)
    {
     // TODO: CREATESTRUCT cs를 수정하여 여기에서
     //  Window 클래스 또는 스타일을 수정합니다.

     return CView::PreCreateWindow(cs);
    }

    // CMFCportingView 그리기

    void CMFCportingView::OnDraw(CDC* /*pDC*/)
    {
     CMFCportingDoc* pDoc = GetDocument();
     ASSERT_VALID(pDoc);
     if (!pDoc)
      return;

     // TODO: 여기에 원시 데이터에 대한 그리기 코드를 추가합니다.
    }


    // CMFCportingView 인쇄

    BOOL CMFCportingView::OnPreparePrinting(CPrintInfo* pInfo)
    {
     // 기본적인 준비
     return DoPreparePrinting(pInfo);
    }

    void CMFCportingView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
     // TODO: 인쇄하기 전에 추가 초기화 작업을 추가합니다.
    }

    void CMFCportingView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
     // TODO: 인쇄 후 정리 작업을 추가합니다.
    }


    // CMFCportingView 진단

    #ifdef _DEBUG
    void CMFCportingView::AssertValid() const
    {
     CView::AssertValid();
    }

    void CMFCportingView::Dump(CDumpContext& dc) const
    {
     CView::Dump(dc);
    }

    CMFCportingDoc* CMFCportingView::GetDocument() const // 디버그되지 않은 버전은 인라인으로 지정됩니다.
    {
     ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCportingDoc)));
     return (CMFCportingDoc*)m_pDocument;
    }
    #endif //_DEBUG


    // CMFCportingView 메시지 처리기

    void CMFCportingView::OnPaint()
    {
     CPaintDC dc(this); // device context for painting
     // TODO: 여기에 메시지 처리기 코드를 추가합니다.
     // 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.
    }


    void CMFCportingView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
    {
     // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

     switch (nChar)
     {
     case VK_ESCAPE:  // exit full screen
      DestroyWindow();
      break ;

     case VK_RETURN:  // activate the currently selected button
     case VK_LEFT:  // select the left button
     case VK_RIGHT:  // select the right button
     case VK_DOWN:  // select the lower button
     case VK_UP:   // select the upper button
      break ;

      // TODO: Place code here.

     }
     CView::OnKeyUp(nChar, nRepCnt, nFlags);
    }

    void CMFCportingView::OnSize(UINT nType, int cx, int cy)
    {
     CView::OnSize(nType, cx, cy);

     // TODO: 여기에 메시지 처리기 코드를 추가합니다.
    }

    void CMFCportingView::OnDestroy()
    {
     CView::OnDestroy();

     // TODO: 여기에 메시지 처리기 코드를 추가합니다.
     PostQuitMessage(0) ;
    }




    //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★


    //------------------------------------------------------------------------------
    // Name: CDShowAppApp::SetAppValues()
    // Desc: This method sets the basic application values like szAppName and hInstance
    //------------------------------------------------------------------------------


    void CMFCportingView::SetAppValues(PTSTR szAppName, int iAppTitleResId)
    {
     // The Windows stuff
     lstrcpy(m_szAppName, szAppName) ;
     // LoadString(m_hInstance, IDS_APP_TITLE, m_szAppTitle, 100) ;
    }


    //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★


    //------------------------------------------------------------------------------
    // Name: CMFCportingView::OnFilePlayRun()
    // Desc: 재생 실행
    //------------------------------------------------------------------------------


    HRESULT CMFCportingView::OnFilePlayRun()
    {
     HRESULT hr ;

     // 필터그래프매니저가 생성되지 않은 경우
     if (m_pGB == NULL)
      JIF(OnFileOpenRun()) ;

     // Query for media control interfaces

     //--------------- 컴포넌트 인터페이스 얻기  -----------------------
     IMediaControl * pMC ;
     JIF(m_pGB->QueryInterface(IID_IMediaControl, (void **)&pMC)) ;
     if (pMC != NULL)
     {
      // Run the graph to play the media file
      LIF(pMC->Run()) ;
     }
     // Release a interface
     SAFE_RELEASE(pMC) ;
     //-------------------------------------------------------------------

     return hr ;


    }


    void  CMFCportingView::OnFilePlay()
    {
     // TODO: 여기에 명령 처리기 코드를 추가합니다.
     OnFilePlayRun();

    }

    //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    // 일시정지

    HRESULT CMFCportingView::OnFilePauseRun()
    {
     HRESULT hr ;

     // 필터그래프매니저가 생성되지 않은 경우
     if (m_pGB == NULL)
      JIF(OnFileOpenRun()) ;

     // Query for media control interfaces
     IMediaControl * pMC ;
     JIF(m_pGB->QueryInterface(IID_IMediaControl, (void **)&pMC)) ;
     if (pMC != NULL)
     {
      // Pause the graph to pause the media file
      LIF(pMC->Pause()) ;
     }
     // Release a interface
     SAFE_RELEASE(pMC) ;

     return hr ;
    }


    void  CMFCportingView::OnFilePause()
    {
     // TODO: 여기에 명령 처리기 코드를 추가합니다.
     OnFilePauseRun();

    }


    //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    //정지

    HRESULT CMFCportingView::OnFileStopRun()
    {
     HRESULT hr ;

     // 필터그래프매니저가 생성되지 않은 경우
     if (m_pGB == NULL)
      JIF(OnFileOpenRun()) ;

     // Query for media control interfaces
     IMediaControl * pMC ;

     JIF(m_pGB->QueryInterface(IID_IMediaControl, (void **)&pMC)) ;
     if (pMC != NULL)
     {
      // Stop the graph to stop the media file
      LIF(pMC->Stop()) ;
     }
     // Release a interface
     SAFE_RELEASE(pMC) ;

     return hr ;
    }


    void  CMFCportingView::OnFileStop()
    {
     // TODO: 여기에 명령 처리기 코드를 추가합니다.
     OnFileStopRun();
    }


    //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    // 파일 열기
    HRESULT CMFCportingView::OnFileOpenRun()
    {
     HRESULT hr ;

     // 필터그래프매니저를 제거하여 필터그래프의 누적 방지!
     if (m_pGB != NULL)
     {
    //  JIF(OnFileClose()) ;
     }

     CString strPath;
     CFileDialog dlg(TRUE);
     if( dlg.DoModal() == IDOK)
     {
      strPath = dlg.GetPathName();
     }

     strcpy(m_szFileName, strPath); // ANSI...

     // Retrieve the name of the selected file
     WCHAR wFileName[MAX_PATH] ;

    #ifndef UNICODE
      MultiByteToWideChar(CP_ACP, 0, m_szFileName, -1, wFileName, MAX_PATH) ;
    #else
      lstrcpy(wFileName, m_szFileName);
    #endif


        // Clear open dialog remnants before calling RenderFile()
     AfxGetMainWnd()->SetWindowText(m_szFileName) ;

     // 필터그래프매니저 생성 (멤버 변수로 보관)
        // Get the interface for DirectShow's GraphBuilder
        JIF(CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&m_pGB)) ;


     // Render File ...
     // Have the graph construct its the appropriate graph automatically
     // 필터 그래프 매니져 : NULL Rendering...
     JIF(m_pGB->RenderFile(wFileName, NULL)) ;

    #ifdef REGISTER_FILTERGRAPH
        hr = AddGraphToRot(m_pGB, &m_dwGraphRegister) ;
        if (FAILED(hr))
        {
            TRACE(TEXT("Failed to register filter graph with ROT!  hr=0x%x"), hr) ;
            m_dwGraphRegister = 0 ;
        }
    #endif

     return S_OK ;

    }

    void  CMFCportingView::OnFileOpen()
    {
     // TODO: 여기에 명령 처리기 코드를 추가합니다.
     OnFileOpenRun();
    }


    HRESULT CMFCportingView::OnFileNewRun()
    {
     // 필터그래프매니저가 생성되지 않은 경우
     if (m_pGB == NULL)
      return E_ABORT ;

      HRESULT hr ;

     // Query for media control interfaces
     IMediaControl * pMC ;
     // JIF(m_pGB->QueryInterface(IID_IMediaControl, (void **)&pMC)) ;
     if (pMC != NULL)
     {
      // Stop the graph to stop the media file
      LIF(pMC->Stop()) ;
     }
     // Release a interface
     SAFE_RELEASE(pMC) ;

    #ifdef REGISTER_FILTERGRAPH
     if (m_dwGraphRegister)
     {
      RemoveGraphFromRot(m_dwGraphRegister) ;
      m_dwGraphRegister = 0 ;
     }
    #endif

     // 필터그래프매니저를 제거하여 필터그래프의 누적 방지!
     // Release Filter Graph Manager
     SAFE_RELEASE(m_pGB) ;

     // 기본 윈도우 타이틀로 변경
     AfxGetMainWnd()->SetWindowText(m_szAppTitle) ;

     return S_OK;
    }

    void  CMFCportingView::OnFileNew()
    {
     // TODO: 여기에 명령 처리기 코드를 추가합니다.

     OnFileNewRun();
    }


     


    // stdafx.cpp : 표준 포함 파일만 들어 있는 소스 파일입니다.
    // MFCporting.pch는 미리 컴파일된 헤더가 됩니다.
    // stdafx.obj에는 미리 컴파일된 형식 정보가 포함됩니다.

    #include "stdafx.h"


     


    //------------------------------------------------------------------------------
    // File: Auxiliary.h
    //
    // Desc: Useful auxiliaries for the Win32 Application.
    //
    // Copyright (c) 2000 - 2005, L544™ Technology.  All rights reserved.
    //------------------------------------------------------------------------------

    #if !defined(L544_AUXILIARY_H__3F5BAE08_581B_4008_ABB4_0A4D2D3456C6__INCLUDED_)
    #define L544_AUXILIARY_H__3F5BAE08_581B_4008_ABB4_0A4D2D3456C6__INCLUDED_

    #if _MSC_VER > 1000
    #pragma once
    #endif // _MSC_VER > 1000


    //
    // Function prototypes
    //

    //#ifdef _DEBUG

    //void TRACE(LPCTSTR lpszFormat, ...) ;

    //#endif

    #ifdef REGISTER_FILTERGRAPH

    // graph spy utility
    HRESULT AddGraphToRot(IUnknown *pUnkGraph, DWORD *pdwRegister);
    void RemoveGraphFromRot(DWORD pdwRegister);

    #endif


    //
    // Macros
    //

    #define SAFE_RELEASE(x) { if (x) x->Release(); x = NULL; }

    #define JIF(x) { if (FAILED(hr=(x))) \
     { TRACE(TEXT("FAILED(hr=0x%x) in ") TEXT(#x) TEXT("\n"), hr); return hr; }}

    #define LIF(x) { if (FAILED(hr=(x))) \
     { TRACE(TEXT("FAILED(hr=0x%x) in ") TEXT(#x) TEXT("\n"), hr); }}


    //
    // Useful Defines
    //


    #endif // !defined(L544_AUXILIARY_H__3F5BAE08_581B_4008_ABB4_0A4D2D3456C6__INCLUDED_)



    // MainFrm.h : CMainFrame 클래스의 인터페이스
    //


    #pragma once

    class CMainFrame : public CFrameWnd
    {
     
    protected: // serialization에서만 만들어집니다.
     CMainFrame();
     DECLARE_DYNCREATE(CMainFrame)

    // 특성입니다.
    public:

    // 작업입니다.
    public:

    // 재정의입니다.
    public:
     virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

    // 구현입니다.
    public:
     virtual ~CMainFrame();
    #ifdef _DEBUG
     virtual void AssertValid() const;
     virtual void Dump(CDumpContext& dc) const;
    #endif

    protected:  // 컨트롤 모음이 포함된 멤버입니다.
     CToolBar    m_wndToolBar;

    // 생성된 메시지 맵 함수
    protected:
     afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
     DECLARE_MESSAGE_MAP()
    };


     


    // MFCporting.h : MFCporting 응용 프로그램에 대한 주 헤더 파일
    //
    #pragma once

    #ifndef __AFXWIN_H__
    #error "PCH에 대해 이 파일을 포함하기 전에 'stdafx.h'를 포함합니다."
    #endif

    #include "resource.h"       // 주 기호입니다.


    // CMFCportingApp:
    // 이 클래스의 구현에 대해서는 MFCporting.cpp을 참조하십시오.
    //


    class CMFCportingApp : public CWinApp
    {
     friend int APIENTRY WinMain(HINSTANCE hInstance,
      HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);

    public:
     CMFCportingApp();
     ~CMFCportingApp();

     // 재정의입니다.
    public:
     virtual BOOL InitInstance();

     // 구현입니다.
     afx_msg void OnAppAbout();
     DECLARE_MESSAGE_MAP()

    };

    extern CMFCportingApp theApp;



    // MFCportingDoc.h : CMFCportingDoc 클래스의 인터페이스
    //


    #pragma once


    class CMFCportingDoc : public CDocument
    {
    protected: // serialization에서만 만들어집니다.
     CMFCportingDoc();
     DECLARE_DYNCREATE(CMFCportingDoc)

    // 특성입니다.
    public:

    // 작업입니다.
    public:

    // 재정의입니다.
    public:
     virtual BOOL OnNewDocument();
     virtual void Serialize(CArchive& ar);

    // 구현입니다.
    public:
     virtual ~CMFCportingDoc();
    #ifdef _DEBUG
     virtual void AssertValid() const;
     virtual void Dump(CDumpContext& dc) const;
    #endif

    protected:

    // 생성된 메시지 맵 함수
    protected:
     DECLARE_MESSAGE_MAP()


    };


     


    // MFCportingView.h : CMFCportingView 클래스의 인터페이스
    //


    #pragma once

    //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    interface IGraphBuilder;

    //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    class CMFCportingView : public CView
    {
    protected: // serialization에서만 만들어집니다.
     CMFCportingView();
     DECLARE_DYNCREATE(CMFCportingView)

    // 특성입니다.
    public:
     CMFCportingDoc* GetDocument() const;

    // 작업입니다.
    public:
    //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
     TCHAR               m_szAppName[50] ;   // internal name of the app
     TCHAR               m_szAppTitle[50] ;   // title bar text
     TCHAR    m_szFileName[MAX_PATH] ;


    #ifdef REGISTER_FILTERGRAPH
     DWORD    m_dwGraphRegister ;
    #endif

    private:
     // DirectShow interfaces
     IGraphBuilder * m_pGB ;

    //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★



    // 재정의입니다.
    public:
     virtual void OnDraw(CDC* pDC);  // 이 뷰를 그리기 위해 재정의되었습니다.
     virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    protected:
     virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
     virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
     virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

    // 구현입니다.
    public:
     virtual ~CMFCportingView();
    #ifdef _DEBUG
     virtual void AssertValid() const;
     virtual void Dump(CDumpContext& dc) const;
    #endif

    protected:

    // 생성된 메시지 맵 함수
    protected:
     DECLARE_MESSAGE_MAP()
    public:
     afx_msg void OnPaint();
    public:
     afx_msg void OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags);
    public:
     afx_msg void OnSize(UINT nType, int cx, int cy);
    public:
     afx_msg void OnDestroy();
    //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    public:
     afx_msg void OnFilePlay();
     afx_msg void OnFilePause();
     afx_msg void OnFileStop();
     afx_msg void OnFileOpen();
     afx_msg void OnFileNew();

    public:
     HRESULT OnFilePlayRun();
     HRESULT OnFilePauseRun();
     HRESULT OnFileStopRun();
     HRESULT OnFileOpenRun();
     HRESULT OnFileNewRun();

    //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★


    //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    public:
     void SetAppValues(PTSTR szAppName, int iAppTitleResId);
    public:
     inline const TCHAR * GetAppName(void) const { return m_szAppName ; } ;

    //★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★



    };

    #ifndef _DEBUG  // MFCportingView.cpp의 디버그 버전
    inline CMFCportingDoc* CMFCportingView::GetDocument() const
       { return reinterpret_cast<CMFCportingDoc*>(m_pDocument); }
    #endif



    // stdafx.h : 자주 사용하지만 자주 변경되지는 않는
    // 표준 시스템 포함 파일 및 프로젝트 관련 포함 파일이
    // 들어 있는 포함 파일입니다.

    #pragma once

    #ifndef _SECURE_ATL
    #define _SECURE_ATL 1
    #endif

    #ifndef VC_EXTRALEAN
    #define VC_EXTRALEAN  // 거의 사용되지 않는 내용은 Windows 헤더에서 제외합니다.
    #endif

    // 아래 지정된 플랫폼에 우선하는 플랫폼을 대상으로 하는 경우 다음 정의를 수정하십시오.
    // 다른 플랫폼에 사용되는 해당 값의 최신 정보는 MSDN을 참조하십시오.
    #ifndef WINVER    // Windows XP 이상에서만 기능을 사용할 수 있습니다.
    #define WINVER 0x0501  // 다른 버전의 Windows에 맞도록 적합한 값으로 변경해 주십시오.
    #endif

    #ifndef _WIN32_WINNT  // Windows XP 이상에서만 기능을 사용할 수 있습니다.                  
    #define _WIN32_WINNT 0x0501 // 다른 버전의 Windows에 맞도록 적합한 값으로 변경해 주십시오.
    #endif      

    #ifndef _WIN32_WINDOWS  // Windows 98 이상에서만 기능을 사용할 수 있습니다.
    #define _WIN32_WINDOWS 0x0410 // Windows Me 이상에 맞도록 적합한 값으로 변경해 주십시오.
    #endif

    #ifndef _WIN32_IE   // IE 6.0 이상에서만 기능을 사용할 수 있습니다.
    #define _WIN32_IE 0x0600 // 다른 버전의 IE에 맞도록 적합한 값으로 변경해 주십시오.
    #endif

    #define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 일부 CString 생성자는 명시적으로 선언됩니다.

    // MFC의 공통 부분과 무시 가능한 경고 메시지에 대한 숨기기를 해제합니다.
    #define _AFX_ALL_WARNINGS

    #include <afxwin.h>         // MFC 핵심 및 표준 구성 요소입니다.
    #include <afxext.h>         // MFC 확장입니다.


    #include <afxdisp.h>        // MFC 자동화 클래스입니다.


    #ifndef _AFX_NO_OLE_SUPPORT
    #include <afxdtctl.h>  // Internet Explorer 4 공용 컨트롤에 대한 MFC 지원입니다.
    #endif
    #ifndef _AFX_NO_AFXCMN_SUPPORT
    #include <afxcmn.h>   // Windows 공용 컨트롤에 대한 MFC 지원입니다.
    #endif // _AFX_NO_AFXCMN_SUPPORT

    #include <assert.h>


    #include <dshow.h>
    #include "Auxiliary.h"


    #ifdef _UNICODE
    #if defined _M_IX86
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
    #elif defined _M_IA64
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
    #elif defined _M_X64
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
    #else
    #pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
    #endif
    #endif


     


    설명서.txt

    [ DSHOW COMPONENT 를 사용한 플레이어 개발 ]

    1. DSHOW COMPONENT 생성

        1.1 개발 환경 구축

       - 컴포넌트의 iid,  컴포넌트 인터페이스의 선언부...
          _i.c,  .h ==>  
         #include <dshow.h>    strmiids.lib

        - COMPONENT 사용시 => COM API 초기화  & 해제

           CoInitialize(NULL)
           CoUninitialize() ;


        1.2 컴포넌트 객체 생성

             => 필터 그래프메니져
              IGraphBuilder * m_pGB ; // 필터 그래프 매니져

              CLSID_FilterGraph  // CLSID
              IID_IGraphBuilder  // 필터그래프 매니저 컴포넌
        // 토에 접근할 수 있는 노출 인터페이스



       1.3 필터그래프 매니저를 통한 메서드 호출
             1) 필터 그래프 구성을 위한  NULL 랜더링 실행

                 m_pGB->RenderFile(wFileName, NULL);



    라이브러리는 -> 프로젝트 -> 프로젝트속성 -> 링커 -> 입력 -> 추가 종속성 에서 strmiids.lib  선언


    vc6.0 에서는 HRESULT 를 리턴하는 이벤트 함수는 에러가 나지 않지만...
    vc2005 에서는 이벤트 함수는 void 값을 반환 해야 하기 때문에...
    static_cast 에러가 난다.... 때문에... 그런 에러를 수정하기 위해서..
    HRESULT 를 반환하는 함수를 따로 선언 한 다음.. 수행 코드를 작성해 주고...
    이벤트 함수에서는 HRESULT 를 반환 하는 함수를 호출하여 작업을 수행 한다.



    반응형

    "이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."