65.9K
CodeProject 正在变化。 阅读更多。
Home

区分 CD 和 DVD 驱动器

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.38/5 (5投票s)

2007年3月27日

1分钟阅读

viewsIcon

57454

downloadIcon

393

提供代码来确定驱动器是CD驱动器还是DVD驱动器。

Screenshot - CDorDV1.jpg

引言

本文包含的代码演示了一种确定已安装的驱动器是CD驱动器还是DVD驱动器的方法。GetDriveType()的返回值只能告诉你驱动器是DRIVE_CDROM类型,并且对于CD和DVD驱动器都会返回这个值(据我所知)。这里包含的附加代码将帮助你确定CD驱动器和DVD驱动器之间的区别。

背景

我之前在一个项目中需要这些信息,但找不到使用MFC封装它的东西。因此,我编写了这个小程序来测试一些想法,并最终得到了本文包含的代码。

使用代码

这段代码没有什么花哨的地方。用户可以简单地从这个示例中剪切和粘贴他们需要的代码到自己的项目中。

这是完成这项工作的部分

//
CDORDVD CCDOrDVDDriveDlg::GetMediaType(TCHAR cDrive)
{
    CString cs;
    cs.Format(_T("\\\\.\\%c:"),cDrive);
    HANDLE hDrive = CreateFile(cs, GENERIC_READ, FILE_SHARE_READ, 
                               NULL, OPEN_EXISTING, 0, NULL);

    if(hDrive == INVALID_HANDLE_VALUE || GetLastError() != NO_ERROR)
        return CDDRIVE_UNKNOWN;

    UCHAR buffer[2048]; // Must be big enough hold DEVICE_MEDIA_INFO
    ULONG returned;
    BOOL bStatus = DeviceIoControl(hDrive, 
                   IOCTL_STORAGE_GET_MEDIA_TYPES_EX,NULL, 0, 
                   &buffer, 2048, &returned, NULL);

    // Close handle. This should work, but if it can't close it something may
    // have gone wrong in the IOCTL call.
    if (!bStatus || !CloseHandle(hDrive))
        return CDDRIVE_UNKNOWN;

    PGET_MEDIA_TYPES pMediaTypes = (PGET_MEDIA_TYPES) buffer;
    if(pMediaTypes->DeviceType == FILE_DEVICE_CD_ROM)
        return CDDRIVE_CD;
    else if(pMediaTypes->DeviceType == FILE_DEVICE_DVD)
        return CDDRIVE_DVD;

    return CDDRIVE_UNKNOWN;
}

关注点

在创建这段小程序时,我尝试了几个想法。我需要它能在从WinNT到任何版本的Windows上工作。我需要知道区别是因为我的程序的最终用户可能拥有这两种类型的介质,并且我希望向他们显示最合乎逻辑的驱动器。

历史

  • 版本 1.0 - 2007年3月28日。
  • 版本 1.1 - 2007年3月29日 - 修复了项目文件。
© . All rights reserved.