//------------------------------------------------------------------------------
// 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 를 반환 하는 함수를 호출하여 작업을 수행 한다.
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."