본문 바로가기
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 를 반환 하는 함수를 호출하여 작업을 수행 한다.



반응형

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