新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 C/C++编程思想 』 → 如何用VC++控制多光驱 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 2867 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 如何用VC++控制多光驱 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客楼主
    发贴心情 如何用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函数获得

       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2008/4/17 13:56:00
     
     GoogleAdSense
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/5/19 11:07:55

    本主题贴数1,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    3,406.250ms