導(dǎo)讀: 對于初學(xué)者,編寫CD播放器不妨為一種入門的捷徑。CD播放器的核心在于MCI命令,,而在各種媒體上介紹MCI命令如何使用的文章比比皆是,因此我暫且對其略過不談,。在這兒,,我著重向大家介紹一個比較重要的技術(shù)--多光驅(qū)的支持。 人們的機(jī)器上的光驅(qū)往往不止一個,,有普通的CDROM,、有CDR、有DVD,,還有窮人使用的虛擬光驅(qū):)。這樣一來,,對于編寫多媒體軟件的程序員就出了個難題:如何能在軟件中加入多光驅(qū)的支持,。要解決這個問題,首先要學(xué)會兩個API函數(shù),,其目的是獲得目標(biāo)電腦的光驅(qū)數(shù),。 GetLogicalDrives() 該函數(shù)功能是返回一個代表當(dāng)前變量磁盤驅(qū)動器的位掩碼; 該函數(shù)原型為:DWORD GetLogicalDrives(VOID),; 該函數(shù)如果調(diào)用成功,,返回值為一個代表當(dāng)前變量磁盤驅(qū)動器的位屏蔽掩碼,位的位置0為驅(qū)動器A,,1為驅(qū)動器B,,2為驅(qū)動器C等。如果函數(shù)調(diào)用失敗,,返回值為0,。 舉例:如果某臺電腦上驅(qū)動器為A、C,、D,、E,則函數(shù)調(diào)用成功后的返回值是00011101,,其中最低位代表驅(qū)動器A,,由A存在所以該位掩碼為1,,而由于B不存在,所以倒數(shù)第二位掩碼為0,。 GetDriveType() 該函數(shù)功能是獲得一個磁盤驅(qū)動器的類型,; 該函數(shù)原型為:UINT GetDriveType(LPCTSTR lpRootPathName); 參數(shù)lpRootPathName:指向一個以NULL結(jié)束的指定要返回有關(guān)信息的磁盤根目錄的字符串指針。如果該參數(shù)為NULL,,則函數(shù)用當(dāng)前根目錄,。 返回值:返回值返回指定驅(qū)動器的類型,它是下列值中的一個: DRIVE_UNKNOWN 不能決定驅(qū)動器類型 DRIVE_NO_ROOT_DIR 不存在根目錄 DRIVE_REMOVABLE 磁盤能從驅(qū)動器中刪除 DRIVE_FIXED 磁盤不能從驅(qū)動器中刪除 DRIVE_REMOTE 驅(qū)動器是一個遠(yuǎn)程(網(wǎng)絡(luò))驅(qū)動器 DRIVE_CDROM 驅(qū)動器是一個CDROM驅(qū)動器 DRIVE_RAMDISK 驅(qū)動器是一個RAM磁盤 舉例:判斷F盤是否為光驅(qū) UINT IsCDRom; LPCTSTR Drive; Drive="F:\\"; IsCDRom=GetDriveType(Drive); if (IsCDRom==DRIVE_CDROM) printf("F盤是光驅(qū)"); else printf("F盤不是光驅(qū)"); 以上是兩個API函數(shù)的介紹,,通過這兩個函數(shù)的組合,,我們就可以獲得光驅(qū)數(shù)。 下面簡單的給出源程序: DWORD DriveTemp; LPCTSTR DriveItem; unsigned short DriveNum=0,itemp; UINT IsLogicalCDROM; int CDS=0; //光驅(qū)數(shù) DriveTemp=GetLogicalDrives(); //獲得磁盤驅(qū)動器位掩碼 while(DriveTemp)` //獲得驅(qū)動器數(shù)目 { DriveTemp>>=1; DriveNum++; }; for(itemp=4; itemp<=DriveNum;itemp++) { switch(itemp) { case 4: DriveItem="D:\\"; break; case 5: DriveItem="E:\\"; break; case 6: DriveItem="F:\\"; break; case 7: DriveItem="G:\\"; break; ... case 26: DriveItem="Z:\\"; } IsLogicalCDROM=GetDriveType(DriveItem); if (IsLogicalCDROM==DRIVE_CDROM) //獲得光驅(qū)數(shù)目 { CDName[CDS]=DriveItem; CDS++; } } 以上的代碼僅僅是個框架,,只能獲得光驅(qū)數(shù),,但是大家只要作稍微的改動就可以實現(xiàn)不同的功能,比如將光驅(qū)盤符動態(tài)的加入菜單等等,。而且由于是API函數(shù),,所以以上的算法能被VB、DELPHI使用,。通過以上的技術(shù)與MCI相結(jié)合,,就可以輕而易舉的制作出支持多光驅(qū)的CD播放器以及VCD播放器等。例如使用MCI命令控制多個光驅(qū)的彈出關(guān)閉: //例子:彈出光驅(qū)F CDRomOpen(TRUE,'F') // 關(guān)閉光驅(qū)F CDRomOpen(FALSE,'F') void CDRomOpen(BOOL bOpenDrive,TCHAR cDrive) { MCI_OPEN_PARMS open; MCI_STATUS_PARMS status; DWORD flags; TCHAR szDriveName[4]; strcpy(szDriveName,"?:"); ::ZeroMemory(&open,sizeof(MCI_OPEN_PARMS)); open.lpstrDeviceType=(LPCSTR)MCI_DEVTYPE_CD_AUDIO; szDriveName[0]=cDrive; open.lpstrElementName=szDriveName; flags=MCI_OPEN_TYPE|MCI_OPEN_TYPE_ID|MCI_OPEN_ELEMENT| MCI_OPEN_SHAREABLE; if(!mciSendCommand(0,MCI_OPEN,flags,(unsigned long)&open)) { status.dwItem=MCI_STATUS_READY; if(bOpenDrive) mciSendCommand(open.wDeviceID,MCI_SET,MCI_SET_DOOR_OPEN,0); else mciSendCommand(open.wDeviceID,MCI_SET,MCI_SET_DOOR_CLOSED,0); mciSendCommand(open.wDeviceID,MCI_CLOSE,MCI_WAIT,0); } } //參數(shù)cDrive可以通過前面的兩個API函數(shù)獲得
|