對於初學者,編寫CD播放器不妨為一種入門的捷徑。CD播放器的核心在於MCI命令,而在各種媒體上介紹MCI命令如何使用的文章比比皆是,因此我暫且對其略過不談。在這兒,我著重向大家介紹一個比較重要的技術--多光驅的支持。
人們的機器上的光驅往往不止一個,有普通的CDROM、有CDR、有DVD,還有窮人使用的虛擬光驅:)。這樣一來,對於編寫多媒體軟件的程序員就出了個難題:如何能在軟件中加入多光驅的支持。要解決這個問題,首先要學會兩個API函數,其目的是獲得目標電腦的光驅數。
GetLogicalDrives()
該函數功能是返回一個代表當前變量磁盤驅動器的位掩碼;
該函數原型為:DWORD GetLogicalDrives(VOID);
該函數如果調用成功,返回值為一個代表當前變量磁盤驅動器的位屏蔽掩碼,位的位置0為驅動器A,1為驅動器B,2為驅動器C等。如果函數調用失敗,返回值為0。
舉例:如果某台電腦上驅動器為A、C、D、E,則函數調用成功後的返回值是00011101,其中最低位代表驅動器A,由A存在所以該位掩碼為1,而由於B不存在,所以倒數第二位掩碼為0。
GetDriveType()
該函數功能是獲得一個磁盤驅動器的類型;
該函數原型為:UINT GetDriveType(LPCTSTR lpRootPathName);
參數lpRootPathName:指向一個以NULL結束的指定要返回有關信息的磁盤根目錄的字符串指針。如果該參數為NULL,則函數用當前根目錄。
返回值:返回值返回指定驅動器的類型,它是下列值中的一個:
DRIVE_UNKNOWN 不能決定驅動器類型
DRIVE_NO_ROOT_DIR 不存在根目錄
DRIVE_REMOVABLE 磁盤能從驅動器中刪除
DRIVE_FIXED 磁盤不能從驅動器中刪除
DRIVE_REMOTE 驅動器是一個遠程(網絡)驅動器
DRIVE_CDROM 驅動器是一個CDROM驅動器
DRIVE_RAMDISK 驅動器是一個RAM磁盤
舉例:判斷F盤是否為光驅
UINT IsCDRom;
LPCTSTR Drive;
Drive="F:\\";
IsCDRom=GetDriveType(Drive);
if (IsCDRom==DRIVE_CDROM) printf("F盤是光驅");
else printf("F盤不是光驅");
以上是兩個API函數的介紹,通過這兩個函數的組合,我們就可以獲得光驅數。
下面簡單的給出源程序:
DWORD DriveTemp; LPCTSTR DriveItem;
unsigned short DriveNum=0,itemp;
UINT IsLogicalCDROM;
int CDS=0; //光驅數
DriveTemp=GetLogicalDrives(); //獲得磁盤驅動器位掩碼
while(DriveTemp)` //獲得驅動器數目
{
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) //獲得光驅數目
{
CDName[CDS]=DriveItem;
CDS++;
}
}
以上的代碼僅僅是個框架,只能獲得光驅數,但是大家只要作稍微的改動就可以實現不同的功能,比如將光驅盤符動態的加入菜單等等。而且由於是API函數,所以以上的算法能被VB、DELPHI使用。通過以上的技術與MCI相結合,就可以輕而易舉的制作出支持多光驅的CD播放器以及VCD播放器等。例如使用MCI命令控制多個光驅的彈出關閉:
//例子:彈出光驅F CDRomOpen(TRUE,'F')
// 關閉光驅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);
}
}
//參數cDrive可以通過前面的兩個API函數獲得