2008-09-12 2 views
8

Windows 2000以降のCDトレイをプログラムで閉じる方法を知っている人はいますか? オープンCDトレイが存在しますが、特にW2kではそれを閉じることができません。Windows CDROMイジェクト

可能であれば、バッチファイルからこれを行う方法を特に探していますが、API呼び出しはOKです。

答えて

5

は、Win32 APIを使用して簡単な方法です:


[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); 
    } 
} 

+1

複数のドライブを搭載したシステムではどのように動作しますか?私はドライブを指定するための何も表示されません。 – OwenP

+3

-1ダウン投票では、mciは古代(Win3.x)テクノロジの一部であり、単一のドライブに対してのみうまく動作します。また、Windows Media Playerをインストールする必要がありますか?しかし確信が持てません。ヨーロッパの「N」バージョンのWindowsにはMedia Playerが付属していないので注意してください。 – unixman83

+0

@unixman推奨代替手段は何ですか?そのDeviceIoControlですか? – jalf

1

Nircmdは、CDトレイの開閉など、さまざまなオプションを備えた非常に便利なフリーウェアのコマンドラインユーティリティです。ここで

+0

FYI:www.nirsoft.netは私の会社によってブロックされており、このプログラムについて知りました。 http://spywarefiles.prevx.com/RRIDCH001610050/NIRCMD.EXE.html – kenny

+1

この説明を読んでも気にする必要はありません。Nircmdが気になるような気がしているようです。ソフォス、Avast、ESETはいずれのシステムでも自宅や職場でnircmdをブロックしません。一方、私はPrevxについて聞いたことがありません。 –

11

私は種類のそれは私のようなUSBフラッシュ・ディスクなどのリムーバブルドライブ(のいずれかの種類を吐出する可能性を与えるとしてのDeviceIOControlを使用したいですCDトレイと同様)。ダが適切に(ちょうど適切なエラー処理を追加)のDeviceIOControlをされて使用してディスクをイジェクトするcodez:

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; 
} 
+0

これは素晴らしいですが、正しいスペルの 'DeviceIoControl'(大文字の' O')に注意してください。 – Nate

+0

@ネイト:ありがとう、それを修正! –

+0

このコードはどのように使用しますか、どの言語ですか? – deed02392

3

私はアンドレアスMagnusson氏の答えは、エクスプローラのイジェクトボタンとまったく同じがしたかなりの仕事をしなかったことに気づきました。具体的には、ドライブはAndreasのコードを使用してエクスプローラでグレー表示されませんでしたが、取り出しコマンドを使用した場合はドライブがグレー表示されませんでした。だから私は調査した。

エクスプローラ(Windows 7 SP1 64ビット)から取り出しコマンドを実行しているときにAPIモニタを実行しました。私はまた、How To Ejecting Removable Media in Windows NT/Windows 2000/Windows XPと題された良いMSKBの記事165721を見つけました。 MSKBの記事の中で最も興味深い部分は、以下に引用されています

  1. コールのCreateFile GENERIC_READと| GENERIC_WRITE、FILE_SHARE_READ | FILE_SHARE_WRITE、およびOPEN_EXISTING。 lpFileNameパラメータは\。\ X:(Xは実際のドライブ文字)である必要があります。その他のパラメータはすべてゼロにすることができます。
  2. DeviceIoControlを介してFSCTL_LOCK_VOLUME IOCTLを発行してボリュームをロックします。他のアプリケーションまたはシステムがボリュームを使用している場合、このIOCTLは失敗します。この関数が正常に終了すると、システム内の他のどのボリュームでもボリュームが使用されていないことがアプリケーションに保証されます。
  3. FSCTL_DISMOUNT_VOLUME IOCTLを発行してボリュームをマウント解除します。これにより、ファイルシステムはボリュームのすべての知識を削除し、ボリュームに関して保持している内部情報を破棄します。
  4. IOCTL_STORAGE_MEDIA_REMOVAL IOCTLを発行してメディアを削除できることを確認してください。このIOCTLを呼び出す前に、PREVENT_MEDIA_REMOVAL構造体のPreventMediaRemovalメンバをFALSEに設定します。これにより、デバイスはメディアの取り外しを防止します。
  5. メディアをIOCTL_STORAGE_EJECT_MEDIA IOCTLで取り出します。デバイスが自動排出を許可しない場合は、IOCTL_STORAGE_EJECT_MEDIAをスキップして、ユーザーにメディアの削除を指示することができます。
  6. 最初の手順で取得したボリュームハンドルを閉じるか、FSCTL_UNLOCK_VOLUME IOCTLを発行します。これにより、他のプロセスによってドライブが使用されるようになります。次のよう

アンドレアスの答え、MSKBの記事、およびエクスプローラのスニッフィング私のAPIをまとめることができますボリュームを開くために呼び出さ

  1. CreateFile。 (すべてのメソッド)。
  2. DeviceIoControlFSCTL_LOCK_VOLUMEと呼ばれます。(すべてのメソッド)。
  3. DeviceIoControlFSCTL_DISMOUNT_VOLUMEと呼ばれます。 (アンドレアスとMSKBメソッドのみですが、エクスプローラは何らかの理由でこれを呼び出さないのですが、このIOCTLは、ドライブがエクスプローラでグレー表示されているかどうかに影響するようです。
  4. DeviceIoControlIOCTL_STORAGE_MEDIA_REMOVALPREVENT_MEDIA_REMOVALメンバーはFALSE(MSKBとエクスプローラの方法)に設定されています。この手順はAndreasの答えにはありません。
  5. DeviceIoControlIOCTL_STORAGE_EJECT_MEDIA(AndreasとMSKBの記事)またはIOCTL_DISK_EJECT_MEDIA(Explorer:このIOCTLは廃止され、STORAGE IOCTLに置き換えられていますが、Explorerが以前のものを使用している理由はわかりません。

締結することがMSKBの記事でバックアップされ、最も徹底的かつ完全な手順、ように見えたとして、私は、MSKBの記事で説明した手順に従うことを決めました。

+0

元のポスターは、CD-ROMトレイを取り出す方法を尋ねています。 –

+0

@RossRidge:タイトルに「Windows CDROM Eject」と表示されているのはなぜですか? –

+0

タイトルにもかかわらず、質問は明らかです。 「Windows 2000以上のCDトレイをプログラムで閉じる**方法を知っている人はいますか?」(強調する鉱山) –

0

hereのようにドライブトレイを閉じるには、IOCTL_STORAGE_EJECT_MEDIAでDeviceIoControlを使用する代わりに、IOCTL_STORAGE_LOAD_MEDIAでDeviceIoControlを呼び出す必要があります。

関連する問題