我已经试过很多方法如,都无法在XP和2000系统下返回正确的光驱类型
希望有人能给我一段具体代码

解决方案 »

  1.   

    http://www.devx.com/vb2themax/Tip/19403
    这个貌似不错,不过没有硬件条件测试
      

  2.   

    还有这个:http://vbnet.mvps.org/index.html?code/disk/getmediatype.htm
      

  3.   

    谢谢tzwsoho你的两个我都看过了。还是无法识别出普通光驱还是刻录机,只能分别出CD还是DVD
      

  4.   

    到设备管理器里看了一下,貌似那里面也没有哪里说明一个光驱设备是否能支持刻录.大约只能与光驱进行通讯了.这个估计属于一些IDE之类的协议吧,你分析一下NERO之类的刻录软件都调用了哪些API来得到了哪些信息.
      

  5.   

    不好意思回复慢了,NERO的组件也已经试过了,调用好返回一样还是无法识别
      

  6.   

    呵呵, 注册表找一下不就知道了 ? 我的是 2000系统, XP应该差不多吧 ? 就照这个思路吧.我特地装了一个刻录光驱来测试, 下面代码在我2000的系统没问题.'添加 Command1Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
    Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
    Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
    Const HKEY_LOCAL_MACHINE = &H80000002
    Const REG_SZ = 1
    Dim Ret
    Private Sub Command1_Click() '查看
       Ret = GetString(HKEY_LOCAL_MACHINE, "system\currentcontrolset\services\cdrom\ENUm", "0")
       If Ret <> "" Then
          If InStr(Ret, "CD-RW") > 0 Then
             MsgBox "刻录机"
          Else
             MsgBox "普通光驱"
          End If
       Else
          MsgBox "无光驱"
       End If
    End SubFunction GetString(hKey As Long, strPath As String, strValue As String)
       RegOpenKey hKey, strPath, Ret
       GetString = RegQueryStringValue(Ret, strValue)
       RegCloseKey Ret
    End FunctionFunction RegQueryStringValue(ByVal hKey As Long, ByVal strValueName As String) As String
       Dim lResult&, lValueType&, strBuf$, lDataBufSize&
       lResult = RegQueryValueEx(hKey, strValueName, 0, lValueType, ByVal 0, lDataBufSize)
       If lResult = 0 Then
          If lValueType = REG_SZ Then
             strBuf = String(lDataBufSize, Chr$(0))
             lResult = RegQueryValueEx(hKey, strValueName, 0, 0, ByVal strBuf, lDataBufSize)
             If lResult = 0 Then RegQueryStringValue = Left$(strBuf, InStr(1, strBuf, Chr$(0)) - 1)
          ElseIf lValueType = REG_BINARY Then
             Dim strData%
             lResult = RegQueryValueEx(hKey, strValueName, 0, 0, strData, lDataBufSize)
             If lResult = 0 Then RegQueryStringValue = strData
          End If
       End If
    End Function
      

  7.   

    CD-RW代表CD刻录机
    那DVD-RW是不是代表DVD刻录机?
      

  8.   

    谢谢CBM666
    这个方法我也想过,不过后来发现很多品牌的刻录机都不包含RW等字符
    所以没有继续试这个方法,因为这串字符是生产厂家按自己的定的格式随意定的,没有通用性
      

  9.   

     No, CDROM 与 CD-RW 是通用的名称只要是正规的厂商都遵循这个规则,就算没有的话,可以如同病毒库一样, 搜集一些可能的名称, 不会有太多种的. If InStr(Ret, "CD-RW") > 0 or InStr(Ret, "CDRW") > 0 or InStr(Ret, "刻录机") > 0 Then 
      

  10.   

    Attn:13F抱歉DVD没试过,但是If InStr(Ret, "CD-RW") > 0 or InStr(Ret, "DVD") > 0 Then  '应该可行
      

  11.   

    像我拿到的一个DVD刻录机的型号就是
    DVD_R
      

  12.   

    不对6#的代码里面应该看的是mediaTypes的MediaInfo(0)成员的MediaCharacteristics成员,然后看看它是否包含以下的其中一个位:MEDIA_CURRENTLY_MOUNTED
     0x80000000
     
    MEDIA_ERASEABLE
     0x00000001
     
    MEDIA_READ_ONLY
     0x00000004
     
    MEDIA_READ_WRITE
     0x00000008
     
    MEDIA_WRITE_ONCE
     0x00000002
     
    MEDIA_WRITE_PROTECTED
     0x00000100
     
    当然如果只是想判断是不是刻录机而不用判断刻录机内光盘的详细信息的话可以参考MediaType成员,这是一个STORAGE_MEDIA_TYPE枚举。具体参照MSDN:
    GET_MEDIA_TYPES Structure:
    http://msdn.microsoft.com/en-us/library/aa363264(VS.85).aspxDEVICE_MEDIA_INFO Structure:
    http://msdn.microsoft.com/en-us/library/aa363241(v=VS.85).aspxSTORAGE_MEDIA_TYPE Enumeration:
    http://msdn.microsoft.com/en-us/library/aa363467(v=VS.85).aspx