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)