我想通过给定一个盘符来判断这个盘是CD盘还是DVD盘。

解决方案 »

  1.   

    用DeviceIoControl,IOCTL_STORAGE_GET_MEDIA_TYPES_EX。可在MSDN中输入IOCTL_STORAGE_GET_MEDIA_TYPES_EX查看相关信息。
      

  2.   

    谢谢各位,功能我已经做出来了,但感觉代码不规范,有点累赘,望高手帮忙修改一下。
    bool is_dvd_drive(tstring drive_letter)
    {
            // IOCTL_STORAGE_GET_MEDIA_TYPES_EX可能返回不止一条DEVICE_MEDIA_INFO,故定义足够的空间
            #define MEDIA_INFO_SIZE sizeof(GET_MEDIA_TYPES)+15*sizeof(DEVICE_MEDIA_INFO)
    HANDLE hDevice;         // 设备句柄
    BOOL bResult;           // DeviceIoControl的返回结果
    GET_MEDIA_TYPES *pmt;   // 内部用的输出缓冲区
    DWORD dwOutBytes;       // 输出数据长度 // 打开设备
    hDevice = ::CreateFile(drive_letter.c_str(), // 文件名
    0, // 不需要读盘
    FILE_SHARE_READ, // 共享方式
    NULL, // 默认的安全描述符
    OPEN_EXISTING, // 创建方式
    0, // 不需设置文件属性
    NULL); // 不需参照模板文件 if (hDevice == INVALID_HANDLE_VALUE)
    {
    return false;
    } pmt = (GET_MEDIA_TYPES *)new BYTE[MEDIA_INFO_SIZE]; bResult = DeviceIoControl(hDevice,    // 设备句柄
    IOCTL_STORAGE_GET_MEDIA_TYPES_EX,   // 取介质类型参数
    NULL, 0,                            // 不需要输入数据
    pmt, MEDIA_INFO_SIZE,               // 输出数据缓冲区
    &dwOutBytes,                        // 输出数据长度
    NULL); // 用同步I/O if (bResult != 0)
    {
    if (pmt->DeviceType == FILE_DEVICE_DVD)
    {
    delete pmt;
    CloseHandle(hDevice);
    return true;
    }
    } delete pmt;
    // 关闭设备句柄
    CloseHandle(hDevice); return false;
    }
      

  3.   

    其中tstring drive_letter是设备名了必须是“\\.\G:”格式,G表示盘符,但盘符可以随便改。
    要是大侠有更简单的方法请告诉小弟,不胜感激啊,谢谢先。
      

  4.   

    基本没什么累赘,可以定义一个bool型变量暂时储存返回值,这样就可以不必写两次delete和CloseHandle了,不过这样写了也没关系,编译器可以把重复的部分优化掉。另外就是#define最好定义在头文件中。
      

  5.   

    非常感谢cnzdgs的建议,问题已经解决,我会很快结帖的。