Domanda

Qualcuno conosce un metodo per chiudere a livello di codice il vassoio del CD su Windows 2000 o versioni successive?Esiste un vassoio per CD aperto, ma non riesco a chiuderlo soprattutto in W2k.

Sto cercando soprattutto un metodo per farlo da un file batch, se possibile, ma le chiamate API andrebbero bene.

È stato utile?

Soluzione

Ecco un modo semplice per utilizzare l'API Win32:


[DllImport("winmm.dll", EntryPoint = "mciSendStringA", CharSet = CharSet.Ansi)]
        protected static extern int mciSendString(string lpstrCommand,StringBuilder lpstrReturnString,int uReturnLength,IntPtr hwndCallback);

 public void OpenCloseCD(bool Open)
 {
    if (Open)
    {
        mciSendString("set cdaudio door open", null, 0, IntPtr.Zero);
    }
    else
    {
        mciSendString("set cdaudio door closed", null, 0, IntPtr.Zero);
    }
}

Altri suggerimenti

Mi piace usare DeviceIOControl perché mi dà la possibilità di espellere qualsiasi tipo di unità rimovibile (come dischi USB e flash, nonché vassoi CD).Il codice per espellere correttamente un disco utilizzando DeviceIOControl è (basta aggiungere la corretta gestione degli errori):

bool ejectDisk(TCHAR driveLetter)
{
  TCHAR tmp[10];
  _stprintf(tmp, _T("\\\\.\\%c:"), driveLetter);
  HANDLE handle = CreateFile(tmp, GENERIC_READ, FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
  DWORD bytes = 0;
  DeviceIoControl(handle, FSCTL_LOCK_VOLUME, 0, 0, 0, 0, &bytes, 0);
  DeviceIoControl(handle, FSCTL_DISMOUNT_VOLUME, 0, 0, 0, 0, &bytes, 0);
  DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, 0, 0, 0, 0, &bytes, 0);
  CloseHandle(handle);
  return true;
}

Ho notato che la risposta di Andreas Magnusson non funzionava esattamente come il pulsante di espulsione di Explorer.Nello specifico, l'unità non veniva disattivata in Explorer utilizzando il codice di Andreas, ma lo era se si utilizzava il comando Espelli.Quindi ho fatto alcune indagini.

Ho eseguito API Monitor durante l'esecuzione del comando Espelli da Explorer (Windows 7 SP1 a 64 bit).Ho anche trovato un buon articolo MSKB 165721 intitolato Come espellere i supporti rimovibili in Windows NT/Windows 2000/Windows XP.La parte più interessante dell'articolo MSKB è citata di seguito:

  1. Chiama CreateFile con GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE e OPEN_EXISTING.Il parametro lpFileName dovrebbe essere \.\X:(dove X è la vera lettera dell'unità).Tutti gli altri parametri possono essere zero.
  2. Blocca il volume emettendo l'IOCTL FSCTL_LOCK_VOLUME tramite DeviceIoControl.Se qualsiasi altra applicazione o sistema utilizza il volume, questo IOCTL avrà esito negativo.Una volta che questa funzione viene restituita correttamente, all'applicazione viene garantito che il volume non verrà utilizzato da nient'altro nel sistema.
  3. Smontare il volume emettendo l'IOCTL FSCTL_DISMOUNT_VOLUME.Ciò fa sì che il file system rimuova tutta la conoscenza del volume e scarti qualsiasi informazione interna conservata relativa al volume.
  4. Assicurarsi che il supporto possa essere rimosso emettendo l'IOCTL IOCTL_STORAGE_MEDIA_REMOVAL.Impostare il membro PreventMediaRemoval della struttura PREVENT_MEDIA_REMOVAL su FALSE prima di chiamare questo IOCTL.Ciò impedisce al dispositivo di impedire la rimozione del supporto.
  5. Espellere il supporto con IOCTL IOCTL_STORAGE_EJECT_MEDIA.Se il dispositivo non consente l'espulsione automatica, è possibile ignorare IOCTL_STORAGE_EJECT_MEDIA e chiedere all'utente di rimuovere il supporto.
  6. Chiudere l'handle del volume ottenuto nel primo passaggio o emettere l'IOCTL FSCTL_UNLOCK_VOLUME.Ciò consente di utilizzare l'unità da altri processi.

La risposta di Andreas, l'articolo MSKB e il mio sniffing API di Explorer possono essere riassunti come segue:

  1. CreateFile chiamato per aprire il volume.(Tutti i metodi).
  2. DeviceIoControl chiamato con FSCTL_LOCK_VOLUME.(Tutti i metodi).
  3. DeviceIoControl chiamato con FSCTL_DISMOUNT_VOLUME.(Solo metodi di Andreas e MSKB.Explorer non lo chiama per qualche motivo.Questo IOCTL sembra essere ciò che influenza se l'unità è disattivata in Explorer o meno.Non sono sicuro del motivo per cui Explorer non lo chiama).
  4. DeviceIoControl chiamato con IOCTL_STORAGE_MEDIA_REMOVAL E PREVENT_MEDIA_REMOVAL membro impostato su FALSE (Metodi MSKB ed Explorer.Questo passaggio manca nella risposta di Andreas).
  5. DeviceIoControl chiamato con IOCTL_STORAGE_EJECT_MEDIA (Articolo di Andreas e MSKB) o IOCTL_DISK_EJECT_MEDIA (Esploratore;notare che questo IOCTL era obsoleto e sostituito con STORAGE IOCTL.Non sono sicuro del motivo per cui Explorer utilizza ancora quello vecchio).

Per concludere, ho deciso di seguire la procedura delineata nell'articolo MSKB, in quanto sembrava essere la procedura più approfondita e completa, supportata da un articolo MSKB.

Nircmd è un'utilità da riga di comando freeware molto utile con varie opzioni, tra cui l'apertura e la chiusura del vassoio del CD.

Per chiudere il vassoio dell'unità, procedere come descritto Qui ma invece di utilizzare DeviceIoControl con IOCTL_STORAGE_EJECT_MEDIA devi chiamare DeviceIoControl con IOCTL_STORAGE_LOAD_MEDIA.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top