Q: What APIs Are Needed In Order To Obtain The CD ROM Drive Letter On The System?
A: You will only need 2 APIs for this purpose :
GetDriveType
GetLogicalDriveStrings
You declare them like the following :
Code:
'Determines whether a disk drive is a removable, fixed, CD-ROM, RAM disk, or network drive
Private Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" _
(ByVal nDrive As String) As Long
'Fills a buffer with strings that specify valid drives in the system.
Private Declare Function GetLogicalDriveStrings Lib "kernel32" _
Alias "GetLogicalDriveStringsA" _
(ByVal nBufferLength As Long, ByVal lpBuffer As String) As Long
Const DRIVE_CDROM& = 5 'Signifies CD ROM
Q: How do I actually use these APIs, In Other Words, How Do We Implement Them?
A: We will need to create a Function / Sub procedure to basically translate the GetLogicalDriveStrings API's return value, so that we can understand it properly, and provide the correct output to the user, in an understandable way :
Code:
Public Function GetDriveStrings() As String
' Wrapper for calling the GetLogicalDriveStrings api
Dim result As Long ' Result of our API calls
Dim strDrives As String ' String to pass to API call
Dim lenStrDrives As Long ' Length of the above string
' Call GetLogicalDriveStrings with a buffer size of zero to
' find out how large our stringbuffer needs to be
result = GetLogicalDriveStrings(0, strDrives)
strDrives = String(result, 0)
lenStrDrives = result
' Call again with our new buffer
result = GetLogicalDriveStrings(lenStrDrives, strDrives)
If result = 0 Then
' There was some error calling the API
' Pass back an empty string
' NOTE - TODO: Implement proper error handling here
GetDriveStrings = ""
Else
GetDriveStrings = strDrives
End If
End Function
Q: IS That All?
A: Nope. Now that we have the correct converted output, we still need to inform the user. The next segment firstly ascertains whether or not a CD ROM exists on the system, then provides us with its Drive letter..
Code:
Private Sub Command1_Click()
Dim strDrives As String
Dim blnDrive As Boolean
' Find out what drives we have on this machine
strDrives = GetDriveStrings()
If strDrives = "" Then
' No drives were found
MsgBox "No Drives were found!", vbCritical
Else
' Walk through the string and check the type of each drive
' displaying any cd-rom drives we find
Dim pos As Long
Dim drive As String
Dim drivetype As Long
pos = 1
Do While Not Mid$(strDrives, pos, 1) = Chr(0)
drive = Mid$(strDrives, pos, 3)
pos = pos + 4
drivetype = GetDriveType(drive)
If drivetype = DRIVE_CDROM Then
blnDrive = True
Else
blnDrive = False
End If
Loop
If blnDrive Then
MsgBox "CD-ROM found at drive " & UCase(drive)
Else
MsgBox "No CD ROM found!"
End If
End If
End Sub
A full working sample is attached to this post.