DVD或CD播放器?

Kar*_*boo 3 c++ hardware optical-drive wmi-query detection

我想知道我的播放器是DVD还是CD播放器......

我试过了 :

SELECT Drive, MediaType, Caption FROM Win32_CDROMDrive
Run Code Online (Sandbox Code Playgroud)

MediaType 在XP上不起作用,在Seven上也不是很好.

我尝试在MediaType中找到一台带有1个播放器(Cd Writer/DVD-ROM)的计算机(带有Windows 7)Cd Writer.

二解决方案:

如果我找到"DVD",我在"标题"中搜索

我尝试了一个软件(SIW - Windows的系统信息)和我的播放器属性:

能力:

CD阅读器:CD ROM,CD R,CD RW

CD刻录机:CD R,CD RW

DVD阅读器:DVD ROM,DVD R,DVD RW,DVD RAM

DVD编剧:没有

SMART支持:否

所以,我想知道:使用WMI查询(或其他解决方案,我使用C++),我是否可以拥有相同的信息?

如果可以的话会很棒!如果我不能,我只保留我的"字符串解析".

RRU*_*RUZ 5

要确定驱动器是DVD还是CDROM,可以将DeviceIoControl函数与IOCTL_STORAGE_GET_MEDIA_TYPES_EX控制代码一起使用,然后检查GET_MEDIA_TYPES结构的DeviceType字段的值.

试试这个样本

#include "stdafx.h"
#include <windows.h>
#include <winioctl.h>
#include <stdio.h>
#include <iostream>
using namespace std;

#define wszDrive L"\\\\.\\D:"
int wmain(int argc, wchar_t *argv[])
{
  BOOL bResult;     
  HANDLE hDevice = INVALID_HANDLE_VALUE;  // handle to the drive to be examined 
  hDevice = CreateFileW(wszDrive,          // drive to open
                        GENERIC_READ,             
                        FILE_SHARE_READ | // share mode
                        FILE_SHARE_WRITE, 
                        NULL,             // default security attributes
                        OPEN_EXISTING,    // disposition
                        0,                // file attributes
                        NULL);            // do not copy file attributes

  if (hDevice == INVALID_HANDLE_VALUE)    // cannot open the drive
  {
    return (FALSE);
  }

  UCHAR lpOutBuffer[2048];
  DWORD nOutBufferSize = sizeof(lpOutBuffer);
  ULONG lpBytesReturned;

  bResult = DeviceIoControl(hDevice,                       // device to be queried
                            IOCTL_STORAGE_GET_MEDIA_TYPES_EX, // operation to perform
                            NULL, 0,                       // no input buffer
                            &lpOutBuffer, nOutBufferSize, &lpBytesReturned,
                            NULL);       

  CloseHandle(hDevice);  
  PGET_MEDIA_TYPES pMediaTypes = (PGET_MEDIA_TYPES) lpOutBuffer;
  if (bResult) 
  {
      if (pMediaTypes->DeviceType==FILE_DEVICE_DVD)       
      {
          wprintf(L"DVD\n");
      }
      else
      if (pMediaTypes->DeviceType==FILE_DEVICE_CD_ROM)    
      {
          wprintf(L"CDROM\n");
      }
  } 
  else 
  {
    wprintf (L"Failed. Error %ld.\n", GetLastError ());
  }
  cin.get();
  return ((int)bResult);
}
Run Code Online (Sandbox Code Playgroud)