亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? imapitools.h

?? CD刻錄,含有源代碼,好東西大家分享哈.互相交流學習.
?? H
字號:
////////////////////////////////////////////////////////////////
// MSDN Magazine -- April 2004
// If this code works, it was written by Paul DiLascia.
// If not, I don't know who wrote it.
// Compiles with Visual Studio .NET on Windows XP. Tab size=3.
//
#pragma once

#ifndef TRACE
#define TRACE ATLTRACE
#endif

#ifndef ASSERT
#define ASSERT ATLASSERT
#endif

class CDiscMaster;

#ifdef _DEBUG
#define TRACEHR(funcname,hr) \
	if (!SUCCEEDED(m_hr)) { TRACE(_T("*** %s returns %s\n"), \
		funcname, IMAPITools::GetErrorName(hr)); }
#else
#define TRACEHR __noop
#endif

//////////////////
// namespace for extern functions
//
namespace IMAPITools {
	extern LPCTSTR GetErrorName(HRESULT hr);
	extern LPCTSTR GetFormatName(const IID& iid);
	extern LPCTSTR GetRecorderTypeName(long type);
	extern LPCTSTR GetRecorderStateName(ULONG state);
	extern LPCTSTR GetMediaTypeName(long mtype);
	extern LPCTSTR GetMediaFlagsName(long mtype);
}

//////////////////
// Wrapper for shell interface ICDBurn.
//
class CCDBurn : public CComQIPtr<ICDBurn>
{
public:
	HRESULT m_hr;	// last error code

	CCDBurn() {
		m_hr = CoCreateInstance(CLSID_CDBurn,NULL,
			CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER);
		TRACEHR(_T("CoCreateInstance"),m_hr);
	}

	~CCDBurn() { }

	// Burn the data in staging area to CD
	//
	BOOL Burn(HWND hwnd) {
		m_hr = (*this)->Burn(hwnd);
		TRACEHR(_T("CCDBurn::Burn"),m_hr);
		return SUCCEEDED(m_hr);
	}

	// Does this machine have a recordable drive?
	//
	BOOL HasRecordableDrive() {
		BOOL bHasIt=FALSE;
		m_hr = (*this)->HasRecordableDrive(&bHasIt);
		TRACEHR(_T("CCDBurn::HasRecordableDrive"),m_hr);
		return (SUCCEEDED(m_hr) && bHasIt);
	}

	// Get drive letter for recordable CD drive, return as STL string.
	//
	CString GetRecorderDriveLetter() {
		WCHAR d[32]={0};
		m_hr = (*this)->GetRecorderDriveLetter(d, sizeof(d)/sizeof(d[0]));
		TRACEHR(_T("CCDBurn::GetRecorderDriveLetter"),m_hr);
		return d;
	}

	// Get location of burn (staging) area. You can change this by setting a
	// registry entry or using TWEAKUI in PowerToys for XP.
	// This is not an ICDBurn method, but useful anyway.
	//
	CString GetBurnFolderPath() {
		TCHAR path[MAX_PATH]={0};
		m_hr = SHGetSpecialFolderPath(NULL, path, CSIDL_CDBURN_AREA, FALSE);
		TRACEHR(_T("CCDBurn::GetBurnFolderPath"),m_hr);
		return path;
	}
};

//////////////////
// Handy struct for media info, instead of several bytes and longs
//
struct MEDIAINFO {
	BYTE  nSessions;
	BYTE  nLastTrack;
	ULONG nStartAddress;
	ULONG nNextWritable;
	ULONG nFreeBlocks;
};

//////////////////
// Handy struct for display names
//
struct DISPLAYNAMES {
	CString vendor;
	CString product;
	CString revision;
};

//////////////////
// Wrapper for IDiscRecorder, representing a recordable CD drive.
//
class CDiscRecorder : public CComQIPtr<IDiscRecorder>
{
public:
	HRESULT m_hr;

	CDiscRecorder() { }
	CDiscRecorder(CDiscMaster& dm);
	~CDiscRecorder() { Close(); }
	
	// Not really a GUID!
	CString GetRecorderGUID() {
		char temp[1024];
		ULONG cbRet;
		m_hr = (*this)->GetRecorderGUID((BYTE*)temp,sizeof(temp),&cbRet);
		TRACEHR(_T("CDiscRecorder::GetRecorderGUID"),m_hr);
		USES_CONVERSION;
		return temp;
	}

	long GetRecorderType() {
		long type=0;
		m_hr = (*this)->GetRecorderType(&type);
		TRACEHR(_T("CDiscRecorder::GetRecorderType"),m_hr);
		return type;
	}

	BOOL GetDisplayNames(DISPLAYNAMES& dn);

	CString GetBasePnPID()
	{
		CComBSTR b(256);
		m_hr = (*this)->GetBasePnPID(&b);
		TRACEHR(_T("CDiscRecorder::GetBasePnPID"),m_hr);
		return SUCCEEDED(m_hr) ? CString(b) : CString();
	}

	CString GetPath()
	{
		CComBSTR b(MAX_PATH);
		m_hr = (*this)->GetPath(&b);
		TRACEHR(_T("CDiscRecorder::GetPath"),m_hr);
 		return SUCCEEDED(m_hr) ? CString(b) : CString();
	}

	BOOL GetRecorderProperties(IPropertyStorage** pstg)
	{
		m_hr = (*this)->GetRecorderProperties(pstg);
		TRACEHR(_T("CDiscRecorder::GetRecorderProperties"),m_hr);
		return SUCCEEDED(m_hr);
	}

	BOOL SetRecorderProperties(IPropertyStorage* pstg)
	{
		m_hr = (*this)->SetRecorderProperties(pstg);
		TRACEHR(_T("CDiscRecorder::SetRecorderProperties"),m_hr);
		return SUCCEEDED(m_hr);
	}

	ULONG GetRecorderState()
	{
		ULONG state;
		m_hr = (*this)->GetRecorderState(&state);
		TRACEHR(_T("CDiscRecorder::GetRecorderState"),m_hr);
		return SUCCEEDED(m_hr) ? state : 0;
	}

	BOOL OpenExclusive()
	{
		m_hr = (*this)->OpenExclusive();
		TRACEHR(_T("CDiscRecorder::OpenExclusive"),m_hr);
		return SUCCEEDED(m_hr);
	}

	BOOL QueryMediaType(long& type, long& flags)
	{
		m_hr = (*this)->QueryMediaType(&type, &flags);
		TRACEHR(_T("CDiscRecorder::QueryMediaType"),m_hr);
		return SUCCEEDED(m_hr);
	}

	BOOL QueryMediaInfo(MEDIAINFO& mi)
	{
		m_hr = (*this)->QueryMediaInfo(&mi.nSessions,
			&mi.nLastTrack,
			&mi.nStartAddress,
			&mi.nNextWritable,
			&mi.nFreeBlocks);
		TRACEHR(_T("CDiscRecorder::QueryMediaInfo"),m_hr);
		return SUCCEEDED(m_hr);
	}

	BOOL Eject()
	{
		m_hr = (*this)->Eject();
		TRACEHR(_T("CDiscRecorder::Eject"),m_hr);
		return SUCCEEDED(m_hr);
	}

	BOOL Erase(BOOL bFullErase)
	{
		m_hr = (*this)->Erase(bFullErase);
		TRACEHR(_T("CDiscRecorder::Erase"),m_hr);
		return SUCCEEDED(m_hr);
	}

	BOOL Close()
	{
		m_hr = p ? (*this)->Close() : S_OK;
		return SUCCEEDED(m_hr);
	}
};

//////////////////
// Wrapper for IDiscMaster, the main IMAPI interface for a mastering session.
//
class CDiscMaster : public CComQIPtr<IDiscMaster>
{
public:
	HRESULT m_hr;

	CDiscMaster() {
		m_hr = CoCreateInstance(CLSID_MSDiscMasterObj,NULL,
			CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER);
		ASSERT(SUCCEEDED(m_hr));
	}
		
	~CDiscMaster() {
		Close();
	}

	// Open the recordable disc
	BOOL Open() {
		return m_hr = (*this)->Open(), SUCCEEDED(m_hr);
	}

	// Get supported formats as array instead of using IEnumXxx
	int GetSupportedFormats(IID* formats, int len);

	// Get/set current active format (data or audio)
	IID GetActiveDiscMasterFormat() {
		IID iid = IID_NULL;
		m_hr = (*this)->GetActiveDiscMasterFormat(&iid);
		TRACEHR(_T("CDiscRecorder::GetActiveDiscMasterFormat"),m_hr);
		return iid;
	}
	BOOL SetActiveDiscMasterFormat(IID& iid, void** pRecorder) {
		m_hr=(*this)->SetActiveDiscMasterFormat(iid,pRecorder);
		TRACEHR(_T("CDiscRecorder::SetActiveDiscMasterFormat"),m_hr);
		return SUCCEEDED(m_hr);
	}

	// Get/set active recorder
	BOOL GetActiveDiscRecorder(CDiscRecorder& recorder)
	{
		m_hr = (*this)->GetActiveDiscRecorder(&recorder);
		TRACEHR(_T("CDiscRecorder::GetActiveDiscRecorder"),m_hr);
		return SUCCEEDED(m_hr);
	}
	BOOL SetActiveDiscRecorder(CDiscRecorder& recorder)
	{
		m_hr = (*this)->SetActiveDiscRecorder(recorder);
		TRACEHR(_T("CDiscRecorder::SetActiveDiscRecorder"),m_hr);
		return SUCCEEDED(m_hr);
	}

	BOOL ClearFormatContent() {
		m_hr = (*this)->ClearFormatContent();
		TRACEHR(_T("CDiscRecorder::ClearFormatContent"),m_hr);
		return SUCCEEDED(m_hr);
	}

	BOOL RecordDisc(BOOL bSimulate=FALSE, BOOL bEjectAfterBurn=FALSE) {
		m_hr = (*this)->RecordDisc(bSimulate, bEjectAfterBurn);
		TRACEHR(_T("CDiscRecorder::RecordDisc"),m_hr);
		return SUCCEEDED(m_hr);
	}

	void Close() {
		m_hr = p ? (*this)->Close() : S_OK;
	}
};

//////////////////
// Handy class to enumerate disc recorders
//
class CDiscRecorderIterator : public CComQIPtr<IEnumDiscRecorders> 
{
public:
	HRESULT m_hr;

	CDiscRecorderIterator(CDiscMaster& dm) {
		HRESULT hr = dm->EnumDiscRecorders(&p);
		ASSERT(SUCCEEDED(hr));
	}

	BOOL Next(CDiscRecorder& dr) {
		ULONG nRet=0;
		dr.Release();
		return SUCCEEDED(m_hr=(*this)->Next(1, &dr.p, &nRet)) && nRet==1;
	}

	BOOL Reset() {
		return SUCCEEDED(m_hr = (*this)->Reset());
	}
};

//////////////////
// Wrapper for IJolietDiscMaster, interface for writing data
// (as oppposed to IRedbookDiscMaster, for audio).
//
class CJolietDiscMaster : public CComQIPtr<IJolietDiscMaster> 
{
public:
	HRESULT m_hr;

	CJolietDiscMaster(CDiscMaster& dm) : CComQIPtr<IJolietDiscMaster>(dm) { }

	long GetTotalDataBlocks() {
		long val=0;
		m_hr = (*this)->GetTotalDataBlocks(&val);
		TRACEHR(_T("CJolietDiscMaster::GetTotalDataBlocks"),m_hr);
		ASSERT(SUCCEEDED(m_hr));
		return val;
	}

	long GetUsedDataBlocks() {
		long val=0;
		m_hr = (*this)->GetTotalDataBlocks(&val);
		TRACEHR(_T("CJolietDiscMaster::GetUsedDataBlocks"),m_hr);
		ASSERT(SUCCEEDED(m_hr));
		return val;
	}

	long GetDataBlockSize() {
		long val=0;
		m_hr = (*this)->GetDataBlockSize(&val);
		TRACEHR(_T("CJolietDiscMaster::GetDataBlockSize"),m_hr);
		return val;
	}

	BOOL GetJolietProperties(IPropertyStorage** pstg)
	{
		m_hr = (*this)->GetJolietProperties(pstg);
		TRACEHR(_T("CJolietDiscMaster::GetJolietProperties"),m_hr);
		return SUCCEEDED(m_hr);
	}

	BOOL AddData(IStorage* stg, BOOL bOverwrite)
	{
		m_hr = (*this)->AddData(stg, bOverwrite);
		TRACEHR(_T("CJolietDiscMaster::AddData"),m_hr);
		return SUCCEEDED(m_hr);
	}
	
};

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日本韩国一区二区三区视频| 国产精品美女www爽爽爽| 精品国产三级电影在线观看| 亚洲丝袜另类动漫二区| 国产资源在线一区| 欧美日韩免费电影| 综合激情成人伊人| 国产在线播放一区| 日韩欧美一区中文| 亚洲夂夂婷婷色拍ww47| 成人av影院在线| 精品国产精品一区二区夜夜嗨| 亚洲国产aⅴ天堂久久| 91香蕉视频污| 国产精品久久久久久福利一牛影视 | 欧美另类变人与禽xxxxx| 亚洲欧洲99久久| 成人午夜激情影院| 国产日本一区二区| 国产一区二区三区日韩| 精品国产免费一区二区三区四区| 日韩1区2区3区| 6080午夜不卡| 香蕉乱码成人久久天堂爱免费| 日本精品视频一区二区三区| 国产精品国产三级国产专播品爱网 | av在线这里只有精品| 国产无人区一区二区三区| 美脚の诱脚舐め脚责91| 91精品午夜视频| 免播放器亚洲一区| 精品免费国产二区三区| 韩国三级在线一区| 久久久久国产成人精品亚洲午夜| 国产精品影视天天线| 国产情人综合久久777777| 国产成人在线视频网站| 国产精品私人影院| 91色porny| 一区二区欧美在线观看| 欧美区一区二区三区| 日韩va欧美va亚洲va久久| 日韩午夜小视频| 精品一区二区日韩| 中文字幕免费在线观看视频一区| 成人av手机在线观看| 亚洲色图在线播放| 337p亚洲精品色噜噜| 精品一区二区三区不卡| 国产精品区一区二区三区| 91久久免费观看| 亚洲bt欧美bt精品| 欧美成人在线直播| 波多野结衣在线aⅴ中文字幕不卡| 国产精品午夜在线观看| 欧美在线你懂的| 国产最新精品免费| 亚洲精品国产高清久久伦理二区| 欧美精品久久久久久久多人混战 | 欧美在线视频全部完| 免费高清视频精品| 国产欧美一区二区精品久导航| 在线视频你懂得一区| 免费精品99久久国产综合精品| 国产日韩欧美综合一区| 欧美写真视频网站| 国产成人啪免费观看软件| 一区二区三区日韩欧美| 精品国产乱码久久久久久图片| 国产99久久久久久免费看农村| 亚洲自拍偷拍网站| 久久综合色鬼综合色| 欧美性生活影院| 成人午夜电影小说| 日本美女一区二区三区| 中文在线资源观看网站视频免费不卡| 91福利视频在线| 国产99一区视频免费 | 精品国产乱码久久久久久影片| 99久久er热在这里只有精品15| 蜜臀精品久久久久久蜜臀| 亚洲欧洲日产国码二区| 欧美成人女星排行榜| 精品视频免费在线| 97成人超碰视| 成人免费视频免费观看| 九九九精品视频| 性做久久久久久免费观看 | 久久精品噜噜噜成人av农村| 一区二区免费在线| 综合自拍亚洲综合图不卡区| 久久一区二区三区国产精品| 欧美一区二区三区视频免费| 色欧美乱欧美15图片| 成人ar影院免费观看视频| 国产在线视视频有精品| 亚洲国产精品一区二区久久| 亚洲另类中文字| 国产精品女同一区二区三区| 2017欧美狠狠色| 精品成人私密视频| 日韩色在线观看| 欧美一区二区三区在线观看| 欧美日韩国产在线观看| 91国偷自产一区二区使用方法| 99国产精品国产精品毛片| 从欧美一区二区三区| 国产一区二区三区| 国产福利一区二区三区在线视频| 精品一区二区三区不卡| 久久99久久精品| 精品一区二区三区免费毛片爱| 美女久久久精品| 极品美女销魂一区二区三区| 玖玖九九国产精品| 国产一区视频网站| 成人在线综合网站| 成人高清伦理免费影院在线观看| 国产精品自拍毛片| 国产精品一区二区在线看| 福利一区二区在线| 99国产精品视频免费观看| 99精品热视频| 欧美色倩网站大全免费| 欧美一区日韩一区| 日韩天堂在线观看| 久久九九全国免费| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 国内成人精品2018免费看| 国内精品久久久久影院薰衣草| 国产成人在线视频免费播放| av一区二区三区在线| 色婷婷国产精品久久包臀| 欧美日韩一区高清| 日韩免费观看2025年上映的电影| 26uuu久久天堂性欧美| 国产精品不卡一区| 日韩在线观看一区二区| 国产老妇另类xxxxx| 色噜噜狠狠成人网p站| 3d成人h动漫网站入口| 欧美国产日产图区| 一卡二卡三卡日韩欧美| 麻豆精品视频在线观看免费| eeuss影院一区二区三区| 欧美日韩国产区一| 久久久久国产精品麻豆| 一区二区欧美国产| 国产精品香蕉一区二区三区| 欧美亚洲综合另类| 久久久五月婷婷| 亚洲一区二区在线免费观看视频| 久久国产视频网| 色婷婷综合久久久久中文 | 成人精品免费网站| 91精品国产福利| 亚洲视频每日更新| 精品亚洲免费视频| 在线观看日韩一区| 中文无字幕一区二区三区| 亚洲国产美国国产综合一区二区 | 免费在线成人网| 91丨porny丨国产入口| 久久综合久色欧美综合狠狠| 亚洲一区二区综合| 91精品视频网| 久久这里只有精品首页| 一区二区在线观看免费视频播放| 蜜乳av一区二区三区| 色先锋aa成人| 欧美韩国日本一区| 久久99久久99| 9191成人精品久久| 亚洲乱码精品一二三四区日韩在线| 免费一区二区视频| 欧美日韩三级一区二区| 亚洲视频在线一区观看| 国产尤物一区二区| 精品区一区二区| 蜜桃精品在线观看| 欧美群妇大交群中文字幕| 亚洲综合一二区| va亚洲va日韩不卡在线观看| 久久精品综合网| 激情综合五月天| 精品久久久久久亚洲综合网| 午夜伦理一区二区| 欧美日韩在线综合| 亚洲一区中文日韩| 色噜噜狠狠成人中文综合| 亚洲欧美区自拍先锋| proumb性欧美在线观看| 国产精品天天摸av网| 国产99久久精品| 国产亚洲欧美日韩在线一区| 国产馆精品极品| 国产精品视频yy9299一区| 国产91色综合久久免费分享| 国产亚洲综合性久久久影院| 国产精品一区在线|