Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Languages / C++

Open or Close CD-ROM drive

3.97/5 (17 votes)
28 Sep 20051 min read 1   3.4K  
Eject or close specified CD-ROM or DVD-ROM in the system.

Image 1

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.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here