This project demonstrates how to open and close a CD or DVD drive drawer. It also works on the new Blu-ray drive I got recently.
I needed a way to open and/or close a drive drawer without regard to whether or not the drawer was already open or closed. This sounds easy, but most of the ways of doing this I tried (like using the MCI library) and I had problems determining whether or not the drawer was open or closed. Using this code, I just tell it what I want it to do. If it's already open, it stays open; if it's closed, it stays closed.
Using the code
There is nothing fancy in this code. Users can simply cut and paste the code needed from this sample into their own projects. This uses a fairly simple IOCTL call. Note: the function returns whether or not the call worked, but this is not necessarily the result the caller intended. For example, most notebook computers will report that a drive is closed, but the drive must be closed manually. Programmers can get around this by detecting that the disc is not ready in the drive.
bool COpenCloseCDDlg::OpenCloseTray(bool bOpen, TCHAR cDrive)
HANDLE hDrive = CreateFile(cs, GENERIC_READ, FILE_SHARE_READ,
if(hDrive == INVALID_HANDLE_VALUE || GetLastError() != NO_ERROR)
BOOL bStatus; DWORD dwDummy; if(bOpen) bStatus = DeviceIoControl(hDrive, IOCTL_STORAGE_EJECT_MEDIA, NULL,
0, NULL, 0, &dwDummy, NULL);
else bStatus = DeviceIoControl(hDrive, IOCTL_STORAGE_LOAD_MEDIA,
NULL, 0, NULL, 0, &dwDummy, NULL);
- Version 1.0 - March 28, 2007