• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 用VC++控制多光驅

    發表于:2007-07-14來源:作者:點擊數: 標簽:
    對于初學者,編寫CD播放器不妨為一種入門的捷徑。CD播放器的核心在于MCI命令,而在各種媒體上介紹MCI命令如何使用的文章比比皆是,因此我暫且對其略過不談。在這兒,我著重向大家介紹一個比較重要的技術--多光驅的支持。 人們的機器上的光驅往往不止一個,有
        對于初學者,編寫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函數獲得

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>