Introduction
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.
Background
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)
{
CString cs;
cs.Format(_T("\\\\.\\%c:"),cDrive);
HANDLE hDrive = CreateFile(cs, GENERIC_READ, FILE_SHARE_READ,
NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if(hDrive == INVALID_HANDLE_VALUE || GetLastError() != NO_ERROR)
return false;
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);
CloseHandle(hDrive);
return bStatus?true:false;
}
History
- Version 1.0 - March 28, 2007