Click here to Skip to main content
Click here to Skip to main content

Open or Close CD-ROM drive

By , 28 Sep 2005
 

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

About the Author

Dalibor Drzik
Web Developer
Slovakia Slovakia
Member
Wink | ;-)

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
Hint: For improved responsiveness ensure Javascript is enabled and choose 'Normal' from the Layout dropdown and hit 'Update'.
You must Sign In to use this message board.
Search this forum  
    Spacing  Noise  Layout  Per page   
GeneralMy vote of 5memberIrineK21 Mar '11 - 10:58 
GeneralDLLImport C# VersionmemberReelix19 Aug '08 - 1:45 
[DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi)]
        protected static extern int mciSendString(string lpstrCommand,
        StringBuilder
        lpstrReturnString,
        int uReturnLength,
        IntPtr hwndCallback);
 
        // Open the CD/DVD Rom
        private void button1_Click(object sender, EventArgs e)
        {
            int ret = mciSendString("set cdaudio door open", null, 0, IntPtr.Zero);
        }
        
        // Close the CD/DVD Rom
        private void button2_Click(object sender, EventArgs e)
        {
            int ret = mciSendString("set cdaudio door closed", null, 0, IntPtr.Zero);
        }
 
I'm not exactly sure what it does if you have more than 1 drive, or what...
 
It works if my DVD Rom is my D: though :p
QuestionI have a error when I debug program open/close CD ROMmemberqv19856 Dec '07 - 17:30 
NewsCorrection: free allocated memorymemberDalibor Drzik22 Dec '06 - 3:07 
QuestionCompile errormember3dOptics21 Dec '06 - 15:46 
AnswerRe: Compile errormemberDalibor Drzik22 Dec '06 - 2:47 
GeneralDoesn't work with multiple drivesmembersfdbgulkierwhgoierhso8gihloiwghiloe22 Sep '06 - 5:12 
GeneralRe: Doesn't work with multiple drivesmemberWilliam C Bonner24 Jun '07 - 7:57 
GeneralRe: Doesn't work with multiple drivesmemberWilliam C Bonner24 Jun '07 - 8:20 
GeneralSuggestionmemberFernando A. Gómez F.13 Jun '06 - 12:19 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Permalink | Advertise | Privacy | Mobile
Web02 | 2.6.130523.1 | Last Updated 28 Sep 2005
Article Copyright 2005 by Dalibor Drzik
Everything else Copyright © CodeProject, 1999-2013
Terms of Use
Layout: fixed | fluid