Re: тpей
- From
- Vadim Yegorov ()
- To
- All ()
- Date
- 2001-07-01T22:37:02Z
- Area
- SU.WINDOWS.NT.PROG
From: "Vadim Yegorov" <zg@matrica.apollo.lv>
Hello, Alexander Boroukhin ! You wrote:
>А никто не в курсе, как это же сделать без MCI? Как, например, делает
>это сама Win, если выбрать "eject" в контекстном меню диска? И еще
>вопрос: как точно определить, открыт ли CD-трей?
void DiskEject(char ADisk,BOOL type)
{
HANDLE DiskHandle;
BOOL Retry=TRUE;
DWORD temp;
BOOL ReadOnly=FALSE;
char DiskPath[7];
strcpy(DiskPath,"\\\\.\\ :");
DiskPath[4]=ADisk;
DiskHandle=CreateFile(DiskPath,GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,
0,0);
if((DiskHandle==INVALID_HANDLE_VALUE) &&
(GetLastError()==ERROR_ACCESS_DENIED))
{
DiskHandle=CreateFile(DiskPath,GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,
0,0);
ReadOnly=FALSE;
}
if(DiskHandle!=INVALID_HANDLE_VALUE)
{
while(Retry)
if(DeviceIoControl(DiskHandle,FSCTL_LOCK_VOLUME,NULL,0,NULL,0,&temp,NULL))
{
if(!ReadOnly)
FlushFileBuffers(DiskHandle);
PREVENT_MEDIA_REMOVAL PreventMediaRemoval;
PreventMediaRemoval.PreventMediaRemoval=FALSE;
if(DeviceIoControl(DiskHandle,IOCTL_STORAGE_MEDIA_REMOVAL,&PreventMediaRemov
al,sizeof(PreventMediaRemoval),NULL,0,&temp,NULL))
{
if(!type)
DeviceIoControl(DiskHandle,IOCTL_STORAGE_EJECT_MEDIA,NULL,0,NULL,0,&temp,NUL
L);
else
DeviceIoControl(DiskHandle,IOCTL_STORAGE_LOAD_MEDIA,NULL,0,NULL,0,&temp,NULL
);
}
Retry=FALSE;
}
else
{
/* error */
}
DeviceIoControl(DiskHandle,FSCTL_UNLOCK_VOLUME,NULL,0,NULL,0,&temp,NULL);
CloseHandle(DiskHandle);
}
}
>(MCI не позволяет
>различить, когда трей открыт, а когда просто нет диска)
Многие сидюки не позволяют этого в принципе. На некоторых при открытом трее
попытка его выдвинуть дает ошибку, на некоторых нет.
--- ifmail v.2.15dev5
* Origin: Fidolook Express http://fidolook.da.ru (2:5020/400)