程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 用VC++控制多光驅

用VC++控制多光驅

編輯:關於VC++

對於初學者,編寫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函數獲得

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved