
Introduction
The mciSendCommand function is very useful to handle CD-ROM drives. You can specify which drive you want to eject or close.
Code explanation
For a device initialization you have to use the mciSendCommand function with the MCI_OPEN command. The MCI_OPEN_TYPE flag must be used whenever a device is specified in the mciSendCommand function. If you open a device by specifying a device-type constant, you must specify the MCI_OPEN_TYPE_ID flag in addition to MCI_OPEN_TYPE.
The MCI_OPEN_PARMS structure contains information for the MCI_OPEN command. We will use the lpstrDeviceType and lpstrElementName members. Devices with extended command sets replace this structure with a device-specific structure so we will get the wDeviceID member.
lpstrDeviceType
Name or constant identifier of the device type. If this member is a constant, it can be one of the values listed in MCI Device Types.
lpstrElementName
Device element (often a path, e.g. "E:").
wDeviceID
Identifier returned to the application.
To know the reason why I use the ZeroMemory function, please read this article.
After receiving the wDeviceID member we are able to send the commands (MCI_SET_DOOR_CLOSED or MCI_SET_DOOR_OPEN) to the specific CD-ROM device directly using the MCI_SET command.
The MCI_CLOSE command releases access to a device.
void CDRomOpen(BOOL bOpenDrive, char *drive)
{
MCI_OPEN_PARMS open;
DWORD flags;
ZeroMemory(&open, sizeof(MCI_OPEN_PARMS));
open.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_CD_AUDIO;
open.lpstrElementName = drive;
flags = MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID;
if (!mciSendCommand(0, MCI_OPEN, flags, (DWORD) &open))
{
mciSendCommand(open.wDeviceID, MCI_SET, (bOpenDrive) ?
MCI_SET_DOOR_OPEN : MCI_SET_DOOR_CLOSED, 0);
mciSendCommand(open.wDeviceID, MCI_CLOSE, MCI_WAIT, 0);
}
}
Points of Interest
Also I suggest you examine the whole source code. There is a cute example of how to parse a command line and how to use the application parameters.