程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
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函數獲得
  
  
  最新評論 [發表評論]
  
  查看所有評論
  
  推薦給好友
  
  打印
  
  
  樓上的看清楚再回復。那段代碼是計算可能的驅動器數目。 ( cooleaf 發表於 2005-4-20 9:37:00)
  
  
  DWord DriveTemp; LPCTSTR DriveItem;
  unsigned short DriveNum=0,itemp;
  UINT IsLogicalCDROM;
  int CDS=0; //光驅數
  DriveTemp=GetLogicalDrives(); //獲得磁盤驅動器位掩碼
  while(DriveTemp)` //獲得驅動器數目
  {
  DriveTemp>>=1;
  DriveNum++;
  };
  就這一段代碼?呢計算出得驅動器數目?
  DriveTemp>>=1;只是右移罷了,能計算出最初DriveTemp
  中第一個1之後有多少位,並不能統計總共有幾個1

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