青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

醬壇子

專注C++技術 在這里寫下自己的學習心得 感悟 和大家討論 共同進步(歡迎批評?。。。?/p>

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  66 Posts :: 16 Stories :: 236 Comments :: 0 Trackbacks

公告

王一偉 湖南商學院畢業 電子信息工程專業

常用鏈接

留言簿(19)

我參與的團隊

搜索

  •  

積分與排名

  • 積分 - 389018
  • 排名 - 64

最新隨筆

最新評論

閱讀排行榜

評論排行榜

小弟想實現將硬盤某個文件夾下的文件刻錄到光盤上

我不想使用第三方的刻錄軟件

不知道XP系統是否有提供這樣的接口,哪位大蝦知道請給小弟一點提示:)給個思考的方向就可以了

謝過了
posted on 2006-10-30 11:41 @王一偉 閱讀(1670) 評論(5)  編輯 收藏 引用

Feedback

# re: 求實現方法??! 2006-10-30 12:07 CornerZhang
XP是自帶這個功能的,我的是English版,只要“IMAPI CD-Burning COM Service”這個系統服務開著,就可以的。怎么用你google一下吧  回復  更多評論
  

# re: 求實現方法!! 2006-10-30 12:22 王一偉
<轉:在網上看見的別人寫的東西>


關于使用IMAPI的一些問題
工作中要求使用IMAPI寫一個小的刻錄測試程序,苦于資料較少,但最后大體理出一些內容,并初步測試通過,把一些心得和問題記錄在此。希望交流一下。程序基于MSDN (April 2004)和微軟工程師Paul DiLascia的一個例程,并作了一定修改,環境是XPsp2和VS.net2003(MFC)。

1.IDiscMaster::ProgressAdvise()的使用
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 聲明一個類,從接口繼承
class CDiscMasterProgressEvents : public CComQIPtr<IDiscMasterProgressEvents>
{
public:
HRESULT m_hr;
int m_nRefCount;

// 進度條控件
CProgressCtrl * m_pCtlProgress;

// 構造和析構
CDiscMasterProgressEvents(/*CWnd * pWnd*/);

ULONG __stdcall AddRef(void);
ULONG __stdcall Release(void);
HRESULT __stdcall QueryInterface(REFIID riid, void **ppv);

// 以下為一些消息的回調函數
// 刻錄結束后被IMAPI調用(Reports that the burn is fully complete.IDiscMaster::RecordDisc()結束時調用)
HRESULT __stdcall NotifyBurnComplete(HRESULT status);

.............................
};

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//類實現代碼
ULONG __stdcall CDiscMasterProgressEvents::AddRef(void)
{
return ++m_nRefCount;
}

ULONG __stdcall CDiscMasterProgressEvents::Release(void)
{
if (--m_nRefCount)
return m_nRefCount;
delete this;
return 0L;
}

HRESULT __stdcall CDiscMasterProgressEvents::QueryInterface(REFIID riid, void **ppv)
{
if(riid == IID_IUnknown)
{
*ppv = (LPUNKNOWN)(IDiscMasterProgressEvents*)this;
m_nRefCount++;
return NOERROR;
}
else if(riid == IID_IDiscMasterProgressEvents)
{
*ppv = (IDiscMasterProgressEvents*)this;
m_nRefCount++;
return NOERROR;
}
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
}

// 刻錄結束后被IMAPI調用
HRESULT __stdcall CDiscMasterProgressEvents::NotifyBurnComplete(HRESULT status)
{
if (status == S_OK)
{
AfxMessageBox("刻錄完畢");
if (m_pCtlProgress)
{
m_pCtlProgress->SetPos(0);
}
}
return status ;
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 類的使用
..........

CDiscMasterProgressEvents * pEvent = new CDiscMasterProgressEvents;
pEvent->m_pCtlProgress = &(pDlg->m_progBurning);
UINT_PTR m_nCookie = 0;

// dm為CDIscMater(class CDiscMaster : public CComQIPtr<IDiscMaster>)
hr = dm.ProgressAdvise(pEvent, &m_nCookie); // ok

..........
hr = dm.RecodeDisc(0, 0);

2. IJolietDiscMaster::AddData()前,所有IStream.Release()和子ISubStorage.Release();
如果沒有釋放,我遇到的問題是數據刻錄到光盤中,但卻看不到;根IStorage在AddData后Release()

3.文件名和文件夾名的問題
pStorage->CreateStream(const WCHAR* pwcsName, ....); // 參數對應刻錄后的文件名
pStorage->CreateStorage(const WCHAR* pwcsName, .....); // 參數對應刻錄后的子文件夾名
上面的兩個參數都不能超過31個字符,不能使用某些特殊字符(!等),否則會造成創建失??;沒有查到資料如何處理超過31字符的文件名,如果有解決問題的方法,希望能和大家交流。

4.光盤的Volume(沒有測試)
通過IJolietDiscMaster::GetJolietProperties()得到;對應的一個IJolietDiscMaster::SetJolietProperties()

5.IDiscRecorder::GetPath(BSTR* pbstrPath)(未解決)
得到刻錄機路徑,MSDN說明:
Parameters
pbstrPath
[out] Path to the disc recorder. This can be a drive letter such as 'E:\', or a full path such as '\Device\CdRom0'.
測試程序中得到的是后者,還沒有找到合理的方式來把兩者掛鉤,特別是多光驅情況下
  回復  更多評論
  

# re: 求實現方法??! 2006-10-30 12:23 王一偉
@CornerZhang
多謝了,我查到的也是這個  回復  更多評論
  

# re: 求實現方法?。? 2006-10-30 12:25 王一偉
http://download.microsoft.com/download/1/6/4/164c2a20-aeb0-460f-907d-985d83e86bd4/CQA0404.exe

用IMAPI實現CD刻錄和設備查找

MFC沒有提供CD刻錄的類,但WindowsXp內置了寫入CD的支持。如果只是復制文件和目錄,可以用shell's ICDBurn接口。如果要刻錄音頻或更近一步的實現對音頻的控制,那么下面會介紹一個專用的API。

ICDBurn有三個方法,HasRecordableDrive掃描系統內可寫的CD驅動器,找到的話返回TRUE。GetRecorderDriveLetter返回可寫驅動器的盤符。最后刻錄指令通知Windows從“集結區”向可寫CD拷貝數據。“集結區”是一個專用的文件夾,通常是"%userprofile%\Local Settings\Application Data\Microsoft\CD Burning", 但還是應該調用SHGetFolderPath和參數CSIDL_CDBURN_AREA獲得準確的目錄名。開發者會經常用到SHGetFolderPath,因為用戶會經常手動或用PowerTools/TweakUI等工具改變刻錄的目錄。

筆者寫了一個很短的類CCDBurn來封裝ICDBurn.這個結構用CLSID_CDBurn調用CoCreateInstance,讀者可調試運行。

CCDBurn burner;

if (!burner.HasRecordableDrive()) {

printf("Oops—No recordable drive!\n");

} else {

CString dl =

burner.GetRecorderDriveLetter();

printf("Default Recorder drive letter =

%s\n", (LPCTSTR)dl);

}



驅動器盤符是在驅動器記錄屬性中啟動CD記錄功能的那個驅動器。只有一個驅動器可以設置這種屬性。假定HasRecordableDrive 返回TRUE,也就是電腦至少有一個可記錄的CD驅動器,你要做的就是把文件拷貝到集結區內,這就是刻錄。

由于筆者很嚴謹,我又加入了另一個步驟GetBurnFolderPath,調用SHGetSpecialFolderPath 得到一個CString形式的刻錄文件目錄:

CString path = burner.GetBurnFolderPath();

如果要寫入音樂,或找到其他刻錄驅動器,或者獲得更詳細的信息:如驅動器是否是可寫的。對此,windows xp提供了IMAPI,它是Image Mastering API的縮寫,不要和 MAPI——用于e-mail的Messaging API 混淆。IMAPI提供了COM接口可以尋找可刻錄驅動器和寫入數據或者指向你最近用過的光驅。

由于與COM的沖突會引起較大的問題,筆者寫了一個小的類庫,IMAPITools,解決了大多數問題。為了說明怎么用這個類庫筆者還寫了一個程序CDINFO。CDINFO在控制臺窗口中顯示CD記錄體的信息。

只要掌握了IMAPI,CD刻錄就不難。但IMAPI很龐大,在講完基礎后再簡要的說一下這個問題。

首先,CDINFO創建了一個對象顯示驅動器盤符和刻錄路徑。接著,創建CDiscMaster 打開IMAPI session:

CDiscMaster dm; // create IDiscMaster

if (!dm.Open()) {

printf("Oops: ...");

return;

CDiscMaster 封裝了第一個主IMAPI 接口IDiscMaster。它調用CoCreateInstance創建 Microsoft MSDiscMasterObj 對象然后得到IDiscMaster 接口。IDiscMaster 例舉出格式和記錄器,選擇活動記錄器等。

CD分為兩種:記錄音頻的CD-Audio和存儲文件的CD-ROM。它們的格式分別為Redbook和Joliet。RedBook是Philips和Sony在80年代根據“redbook" 標準制定的;Joliet是微軟擴展ISO-9660制定的一種CD-ROM文件格式。微軟在win95時代制定Joliet是為了擴展ISO-9660從而支持長文件名和多層目錄。

IDiscMaster::EnumDiscMasterFormats可以例舉出刻錄器支持哪種格式,但是這種方法很耗費資源,我用一個簡單的方法實現了這個功能,CDiscMaster::GetSupportedFormats在數組IID中返回格式:

const MAXNFORMATS = 2;

IID fmts[MAXNFORMATS];

int nFormats = dm.GetSupportedFormats(fmts,MAXNFORMATS);

fmts數組中包含了支持的格式,IID_IRedbookDiscMaster和IID_IJoiletDiscMaster,而再也不用使用IEnumDiscMasterFormats了。有經驗的程序員可能會提出疑問:為什么IMAPI的設計者選擇一個這么復雜的API來獲得只有兩種的支持格式,一行簡單的代碼就可以提供足夠的帶寬來傳送信息。這只有設計者知道答案,也許他們希望有人會用VB寫一個音頻記錄器。不管怎樣,只要你使用了IMAPITools,你就會忘記COM。

一旦打開一個session,就可以實現查詢單個的刻錄驅動器。但IMAPI會再一次使用COM例舉刻錄器,而筆者又用一個類隱藏了這個結構。

CDiscRecorder dr;

CDiscRecorderIterator itr(dm); // dm=CDiscMaster

while (itr.Next(dr)) {

// do something

}



程序每次調用下一步,累加器就會抓取下一段記錄到CDiscRecorder中。CDiscRecorder封裝了其他大的IMAPI接口,CDiscRecorder代表了可記錄CD設備。CDiscRecorder提供了打開記錄器的方法,詢問它的類型(CD-R or CD-RW)和路徑,得到設備屬性,彈出CD等等。CDINFO演示了如何用CDiscRecorder獲得記錄器的所有信息。

要把數據寫入光盤,就要使用IJolietDiscMaster或IRedbookDiscMaster,或者也可以用IMAPITools:

dm.SetActiveDiscRecorder(dr); // select recorder

CJolietDiscMaster jdm(dm); // get joliet interface

jdm保存了IJolietDiscMaster接口,可以調用任何IJolietDiscMaster方法。AddData是寫入數據方法的一種;它需要一個COM IStorage指針。寫入音頻也是一樣的,除非是用IRedbookDiscMaster和AddAudioTrackBlocks 添加未處理的音頻數據(44.1 KHz, 16-bit RAW, WAV 文件也相同)。創建多音軌可以用Create/CloseAudioTrack。AddData 和AddAudioTrackBlocks實際上不往光盤中寫數據,而是寫到集結區中。如果要真正的移動數據,還需要調用RecordDisc:

BOOL bSimulate=FALSE;

BOOL bEjectAfterBurn=TRUE;

dm.RecordDisc(bSimulate, bEjectAfterBurn);

dm.Close();

bSimulate=TRUE會調用RecordDisc模擬刻錄但實際上并未寫入。Windows檢查全部預刻錄列表并刻錄,但實際上并沒有寫入。這可以讓開發者測試和調試軟件而并不需要花很多時間真正的刻錄光盤。

以上簡單介紹了一下IMAPI,但這足夠你開始刻錄編程了。大多數人都會調用IMAPI,除非要寫一個復雜的備份程序或音頻紀錄器。對于普通的拷貝文件,要用到的就是ICDBurn。即使你要顯示出可記錄驅動器列表,用IMAPI也足夠了。
  回復  更多評論
  

# re: 求實現方法?。?a name="Post"> 2006-10-30 13:53 王一偉
注意必須在服務管理器中開啟IMAPI CD-Burning COM Service服務  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国外成人免费视频| 亚洲三级电影全部在线观看高清| 麻豆精品视频在线观看| 羞羞色国产精品| 国产欧美精品一区二区三区介绍| 亚洲欧美精品伊人久久| 亚洲一区二区三区四区中文| 国产欧美一区二区精品忘忧草| 欧美中文字幕久久| 久久久综合网| 99国产精品| 亚洲午夜激情在线| 精品白丝av| 亚洲国产日韩在线| 国产精品久久久久国产a级| 欧美一区日韩一区| 久久深夜福利免费观看| 99爱精品视频| 久久福利毛片| 9久草视频在线视频精品| 在线视频欧美一区| 在线观看亚洲专区| 亚洲精品视频啊美女在线直播| 欧美日韩黄色一区二区| 国产精品色婷婷久久58| 老色鬼久久亚洲一区二区| 欧美大秀在线观看| 久久国产精品黑丝| 欧美成人一区二区在线| 亚洲在线成人精品| 美日韩精品视频免费看| 午夜日韩在线| 欧美激情视频给我| 久久一区二区精品| 国产精品国产三级国产专区53| 免费欧美电影| 国产精品国产三级国产普通话三级 | 欧美国产在线观看| 国产精品v欧美精品v日本精品动漫| 中文国产亚洲喷潮| 久久深夜福利免费观看| 欧美一级专区| 欧美日韩中文字幕在线| 美女国内精品自产拍在线播放| 欧美性大战久久久久久久蜜臀| 欧美肥婆bbw| 韩国免费一区| 欧美一区不卡| 欧美一区二区三区在| 欧美精品久久一区| 欧美成黄导航| 国产一区二区在线观看免费| 一区二区三区你懂的| 亚洲每日在线| 欧美激情第二页| 欧美激情视频免费观看| 在线欧美日韩国产| 久久精品国产一区二区三区免费看 | 亚洲激情欧美| 在线观看欧美成人| 久久www免费人成看片高清| 小黄鸭精品aⅴ导航网站入口 | 亚洲视频综合在线| 一区二区不卡在线视频 午夜欧美不卡在 | 国产美女一区二区| 亚洲日本在线观看| 亚洲麻豆一区| 欧美精品 日韩| 亚洲国产经典视频| 亚洲国产婷婷| 你懂的亚洲视频| 亚洲国产高清aⅴ视频| 国产午夜精品久久久久久久| 午夜精品久久99蜜桃的功能介绍| 午夜精品一区二区三区电影天堂 | 国产精品免费在线| 亚洲私拍自拍| 久久精品国产99| 一色屋精品亚洲香蕉网站| 另类天堂视频在线观看| 久久一区视频| 亚洲激情第一区| 欧美日韩一区二区三区免费看| 中日韩美女免费视频网站在线观看| 亚洲一二三四久久| 国产亚洲精品美女| 久久免费精品日本久久中文字幕| 欧美电影免费观看网站| 夜夜爽av福利精品导航| 国产精品久久午夜夜伦鲁鲁| 欧美怡红院视频| 亚洲福利视频一区二区| 亚洲一区二区三区色| 国产一区激情| 欧美成人午夜剧场免费观看| 99re热这里只有精品视频| 欧美专区18| 91久久国产自产拍夜夜嗨| 欧美日韩一区二区三区| 欧美在线一区二区| 欧美va亚洲va日韩∨a综合色| 日韩午夜免费| 国产综合久久久久久鬼色| 欧美久久久久久久久| 亚洲欧美日韩一区二区| 亚洲国产精品女人久久久| 午夜精品久久久久久久白皮肤| 国产女人精品视频| 欧美成人激情视频免费观看| 亚洲夜间福利| 亚洲日韩欧美视频一区| 久久久久五月天| 亚洲夜间福利| 亚洲第一天堂无码专区| 国产精品久久久久久久浪潮网站 | 欧美日韩一区三区| 一区二区三区视频观看| 欧美v亚洲v综合ⅴ国产v| 亚洲在线播放电影| 一区二区视频免费完整版观看| 欧美精品一区在线播放| 久久激情综合| 亚洲天堂免费观看| 亚洲精品视频在线观看网站| 老司机免费视频一区二区三区| 亚洲一区二区视频| 亚洲伦理在线| 91久久久久久久久久久久久| 国产性天天综合网| 欧美性生交xxxxx久久久| 欧美多人爱爱视频网站| 久久久蜜桃精品| 久久成人资源| 久久成人18免费观看| 亚洲女性裸体视频| 亚洲一区二区高清| 亚洲精品一区二区在线观看| 亚洲第一精品影视| 欧美激情精品久久久久久免费印度| 久久精品视频播放| 久久精品国产清高在天天线| 亚洲午夜一区| 亚洲伦伦在线| 亚洲精品在线免费观看视频| 1024国产精品| 亚洲精品乱码久久久久久蜜桃91 | 欧美日本三区| 亚洲一二三四区| 亚洲无玛一区| 一区二区av在线| 亚洲一区国产| 中文一区二区在线观看| 日韩午夜在线播放| 99综合在线| 亚洲欧美美女| 久久久精品久久久久| 另类欧美日韩国产在线| 欧美xxxx在线观看| 欧美人与性禽动交情品| 欧美日韩一区三区| 国产乱码精品一区二区三区五月婷 | 欧美日韩亚洲三区| 欧美电影免费| 欧美高清视频www夜色资源网| 免费久久99精品国产自在现线| 你懂的视频一区二区| 欧美日韩色一区| 国产精品一区在线播放| 国产亚洲综合性久久久影院| 亚洲第一网站免费视频| 一区二区不卡在线视频 午夜欧美不卡'| 亚洲国产精品成人一区二区| 亚洲最黄网站| 久久久久久夜| 亚洲成在人线av| 一区二区三区日韩| 久久另类ts人妖一区二区| 欧美xx视频| 国产精品夜夜夜| 韩国在线视频一区| 亚洲精品国产精品乱码不99| 亚洲欧美日韩一区二区| 免费看成人av| 亚洲自拍高清| 欧美福利电影在线观看| 国产欧美va欧美va香蕉在| 亚洲欧洲一区| 久久精品国产免费观看| 亚洲精品一区二区三区在线观看| 亚洲综合久久久久| 欧美国产欧美亚洲国产日韩mv天天看完整 | 午夜精品av| 免费成人美女女| 国产精品永久免费视频| 亚洲国产婷婷香蕉久久久久久99 | 欧美一级片久久久久久久| 欧美激情精品久久久久久免费印度| 亚洲欧美日韩一区二区三区在线观看| 老司机aⅴ在线精品导航| 国产精品一区在线观看|