⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mci.cpp

📁 C++编程实践与技巧一书各章节的源码
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////////
// CMciDevice 类实现文件
//
#include "stdafx.h"
#include "mci.h"

//////////////////////////////////////////////////////////////////////////
// CMciDevice implementation
//

// Common Modes
const DWORD CMciDevice::ModeNotReady = MCI_MODE_NOT_READY;
const DWORD CMciDevice::ModePause	 = MCI_MODE_PAUSE;
const DWORD CMciDevice::ModePlay	 = MCI_MODE_PLAY;
const DWORD CMciDevice::ModeStop	 = MCI_MODE_STOP;
const DWORD CMciDevice::ModeOpen	 = MCI_MODE_OPEN;
const DWORD CMciDevice::ModeRecord	 = MCI_MODE_RECORD;
const DWORD CMciDevice::ModeSeek	 = MCI_MODE_SEEK;
// Common status
const DWORD CMciDevice::StatusReady			 = MCI_STATUS_READY;
const DWORD CMciDevice::StatusMediaPresent	 = MCI_STATUS_MEDIA_PRESENT;
const DWORD CMciDevice::StatusMode			 = MCI_STATUS_MODE;
const DWORD CMciDevice::StatusNumberOfTracks = MCI_STATUS_NUMBER_OF_TRACKS;
// Common capabilites
const DWORD CMciDevice::GetdevcapsCanEject	 = MCI_GETDEVCAPS_CAN_EJECT;
const DWORD CMciDevice::GetdevcapsCanPlay	 = MCI_GETDEVCAPS_CAN_PLAY;
const DWORD CMciDevice::GetdevcapsCanRecord	 = MCI_GETDEVCAPS_CAN_RECORD;
const DWORD CMciDevice::GetdevcapsCanSave	 = MCI_GETDEVCAPS_CAN_SAVE;
const DWORD CMciDevice::GetdevcapsCompound	 = MCI_GETDEVCAPS_COMPOUND_DEVICE;
const DWORD CMciDevice::GetdevcapsDeviceType = MCI_GETDEVCAPS_DEVICE_TYPE;
const DWORD CMciDevice::GetdevcapsHasAudio	 = MCI_GETDEVCAPS_HAS_AUDIO;
const DWORD CMciDevice::GetdevcapsHasVideo	 = MCI_GETDEVCAPS_HAS_VIDEO;
const DWORD CMciDevice::GetdevcapsUsesFiles	 = MCI_GETDEVCAPS_USES_FILES;

const DWORD CMciDevice::InfoProduct = MCI_INFO_PRODUCT;

const DWORD CMciDevice::DevtypeAnimation	= MCI_DEVTYPE_ANIMATION;
const DWORD CMciDevice::DevtypeCdaudio		= MCI_DEVTYPE_CD_AUDIO;		
const DWORD CMciDevice::DevtypeDat			= MCI_DEVTYPE_DAT;		
const DWORD CMciDevice::DevtypeDigitalvideo = MCI_DEVTYPE_DIGITAL_VIDEO;
const DWORD CMciDevice::DevtypeOther		= MCI_DEVTYPE_OTHER;
const DWORD CMciDevice::DevtypeOverlay		= MCI_DEVTYPE_OVERLAY;	
const DWORD CMciDevice::DevtypeScanner		= MCI_DEVTYPE_SCANNER;	
const DWORD CMciDevice::DevtypeSequencer	= MCI_DEVTYPE_SEQUENCER;
const DWORD CMciDevice::DevtypeVcr			= MCI_DEVTYPE_VCR;
const DWORD CMciDevice::DevtypeVideodisc	= MCI_DEVTYPE_VIDEODISC;
const DWORD CMciDevice::DevtypeWaveaudio	= MCI_DEVTYPE_WAVEFORM_AUDIO;

CMciDevice::CMciDevice() {
	m_wDeviceID = NULL;
	m_hMainWnd = NULL;
	m_bReportErrors = FALSE;
}

CMciDevice::~CMciDevice() {
}

// 利用名字打开设备(从注册表或system.ini文件中获得)
DWORD CMciDevice::Open(LPCSTR lpstrName, BOOL bShareable /*=FALSE*/) 
{	
	ASSERT(lpstrName != NULL);

	DWORD dwReturn;
	MCI_OPEN_PARMS mciOpenParms;

	//利用指定的设备名打开设备
	mciOpenParms.lpstrDeviceType = lpstrName;		
	
	DWORD dwFlags = MCI_OPEN_TYPE|MCI_WAIT;
	if (bShareable) dwFlags |= MCI_OPEN_SHAREABLE;

	dwReturn = SendCommand(MCI_OPEN, dwFlags, (DWORD)(LPVOID) &mciOpenParms);
	
	if (dwReturn == 0) {
		//设备打开成功,取得设备ID.
		m_wDeviceID = mciOpenParms.wDeviceID;		
	}
	
	return dwReturn;
}

//根据类型打开设备
DWORD CMciDevice::Open(DWORD dwDeviceType, BOOL bShareable /*=FALSE*/) 
{
	DWORD dwReturn;
	MCI_OPEN_PARMS mciOpenParms;

	// 通过指定设备类型常量来打开设备.
	mciOpenParms.lpstrDeviceType = (LPCSTR) dwDeviceType;
	
	DWORD dwFlags = MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_WAIT;
	if (bShareable) dwFlags |= MCI_OPEN_SHAREABLE;

	dwReturn = SendCommand(MCI_OPEN, dwFlags, 
			(DWORD)(LPVOID) &mciOpenParms);

	if (dwReturn == 0) {
		//设备打开成功,取得设备ID.
		m_wDeviceID = mciOpenParms.wDeviceID;		
	}
		
	return dwReturn;
}

//关闭设备
DWORD CMciDevice::Close() {	
	MCI_GENERIC_PARMS mciGenericParms;
	mciGenericParms.dwCallback = (DWORD) m_hMainWnd;
	return SendCommand(MCI_CLOSE, 0, (DWORD) &mciGenericParms);	
}

//取得当前回调窗口
HWND CMciDevice::GetCallbackHwnd() const {
	return m_hMainWnd;
}

//设置当前回调窗口
void CMciDevice::SetCallbackWnd(CWnd *pWnd) {
	ASSERT(pWnd != NULL);
	m_hMainWnd = pWnd->GetSafeHwnd();
}

//设置当前回调窗口
void CMciDevice::SetCallbackWnd(HWND hWnd) {
	ASSERT(hWnd != NULL);
	m_hMainWnd = hWnd;
}

// 把一个MCI设备附加到一个已经打开的设备上
void CMciDevice::Attach(UINT wDeviceID) {
	m_wDeviceID = wDeviceID;
}

//取得设备ID
MCIDEVICEID CMciDevice::GetDeviceID() const {
	return m_wDeviceID;
}

//包装mciSendCommand函数,并附加错误处理
DWORD CMciDevice::SendCommand(UINT uMsg, DWORD fdwCommand, DWORD dwParam) {
	DWORD dwReturn;
	if (dwReturn = mciSendCommand(m_wDeviceID, uMsg, fdwCommand, dwParam)) {
		m_dwLastError = dwReturn;
		if (m_bReportErrors) 
			ShowError(dwReturn);
	}
	return dwReturn;
}

MCIERROR CMciDevice::GetLastError() const {
	return m_dwLastError;
}

DWORD CMciDevice::GetDevCaps(DWORD dwDevcaps, BOOL bItem /*=FALSE*/) {	
	MCI_GETDEVCAPS_PARMS mciCapsParms;

	mciCapsParms.dwCallback = (DWORD) m_hMainWnd;    
    mciCapsParms.dwReturn = 0;
	
	if (bItem) {
		mciCapsParms.dwItem = dwDevcaps;
		dwDevcaps |= MCI_GETDEVCAPS_ITEM;
	}

	SendCommand(MCI_GETDEVCAPS, dwDevcaps, (DWORD) &mciCapsParms);
	
	return mciCapsParms.dwReturn;
}

//普通 MCI_INFO命令
DWORD CMciDevice::GetInfo(DWORD dwInfo, LPSTR lpstrReturn, DWORD dwRetSize) {
	MCI_INFO_PARMS mciInfoParms;	
	 
	mciInfoParms.dwCallback = (DWORD) m_hMainWnd;
    mciInfoParms.lpstrReturn = lpstrReturn;
    mciInfoParms.dwRetSize = dwRetSize;

	return SendCommand(MCI_INFO, dwInfo, (DWORD) &mciInfoParms);	
}


void CMciDevice::ReportErrors(BOOL bReport /*=TRUE*/) {
	m_bReportErrors = bReport;
}

//利用MessageBox函数显示错误信息
void CMciDevice::ShowError(DWORD dwError)
{
    char szErrorBuf[MAXERRORLENGTH];
    MessageBeep(MB_ICONEXCLAMATION);
	
	CWnd* pMainWnd = AfxGetApp()->m_pMainWnd;
	ASSERT(pMainWnd != NULL);
	HWND hMainWnd = pMainWnd->GetSafeHwnd();

    if(mciGetErrorString(dwError, (LPSTR) szErrorBuf, MAXERRORLENGTH)) {
		MessageBox(hMainWnd, szErrorBuf, _T("MCI Error"),
			       MB_ICONEXCLAMATION);
	}
    else
        MessageBox(hMainWnd, _T("Unknown Error"), _T("MCI Error"),
			       MB_ICONEXCLAMATION);
}

// 关闭所有由应用程序打开的MCI设备,然后返回

DWORD CMciDevice::CloseAll()
{
	DWORD dwReturn;

	if (dwReturn = mciSendCommand(MCI_ALL_DEVICE_ID, MCI_CLOSE, MCI_WAIT, NULL))
		ShowError(dwReturn);
	return dwReturn;
}

DWORD CMciDevice::GetMode() {
	return GetStatus(StatusMode);
}

//普通MCI_STATUS命令
DWORD CMciDevice::GetStatus(DWORD dwItem) {	
	MCI_STATUS_PARMS mciStatusParms;
	mciStatusParms.dwCallback = (DWORD) m_hMainWnd;
	mciStatusParms.dwItem = dwItem;
	mciStatusParms.dwReturn = 0;
	
	SendCommand(MCI_STATUS, MCI_STATUS_ITEM, (DWORD) &mciStatusParms);
		
	return mciStatusParms.dwReturn;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -