DOBON.NET DOBON.NETプログラミング掲示板過去ログ

プログラムによってリムーバブルディスクを安全に取り外したい

環境/言語:[Windows2000, C# (VisualStudio2003)]
分類:[.NET]

いつもお世話になっております。

リムーバブルディスクをPCから安全に取り外すには
タスクバーから「ハードウェアを取り外す」処理を行わなければなりませんが、
これをC#のプログラムから自動で取り外せるようにしたいのです。

調べたところ、DllImportによってDeviceIoControl()というAPI関数を
使用すれば良いと分かりました。(かなりの手間が掛かるようですが。)
同関数の使い方についてさらに調べてみたのですが、ここで問題が発生しました。

DeviceIoControl()の第2引数(DWORD型)には、
FSCTL_DISMOUNT_VOLUME・・・ボリュームをマウント解除する
FSCTL_LOCK_VOLUME・・・ボリュームをロックする
IOCTL_STORAGE_MEDIA_REMOVAL・・・メディア取り出しメカニズムを有効または無効にする。
IOCTL_STORAGE_EJECT_MEDIA・・・SCSI デバイスからメディアを取り出す
といった制御コードを指定する必要があるのですが、
これら制御コードの実際の値が分かりません。
ずいぶんと探したのですが何故か見つかりません。

DllImportによってAPI関数を使用するときには、
付随して使用する定数をその都度C#のソース上に定義する必要があり、
制御コードの実際の値が分からないと実装が不可能になります。

面倒な質問で恐縮なのですが、
どなたか上記の制御コードの実際の値がご存知でしたらご教授下さい。
もしくは、プログラムによってリムーバブルディスクをPCから安全に取り外す
もっと良い方法をご存知の方がいらっしゃいましたらご教授下さい。
宜しくお願いします。
■No14902に返信(ikeさんの記事)
> これら制御コードの実際の値が分かりません。
> ずいぶんと探したのですが何故か見つかりません。

http://www.microsoft.com/JAPAN/developer/library/jpwinpf/_win32_deviceiocontrol.htm


_________________________________________________________________________
じゃんぬ - Microsoft MVP for Visual Developer C#
  http://jeanne.wankuma.com/
  http://blogs.wankuma.com/jeanne/
じゃんぬねっとさんへ
素早い回答ありがとうございます。
せっかくの教えていただいたURLですが、申し訳ないのですが、
制御コードの実際の値を見つけることが出来ませんでした。

私の説明が足りませんでした。
知りたいのは
FSCTL_DISMOUNT_VOLUMEやFSCTL_LOCK_VOLUMEといった定義名そのものではなく、
0x00000001や0x00000002といった実際の値です。

例えばSCSIデバイスからメディアを取り出すには
DeviceIoControl()関数の第2引数にIOCTL_STORAGE_EJECT_MEDIAを指定する必要があるのですが、
IOCTL_STORAGE_EJECT_MEDIAの値が何であるかが分からない為、
それを定義することが出来ないでいます。

バカな質問なのかもしれませんが、本当に見つけきれなくて困っています。
どうかご存知の方がいらっしゃいましたらご教授お願いします。
ike 様

VS2003をご利用(C++をインストール済み)でしたら、VS2003をインストールしたフォルダ\Vc7\PlatformSDK\Include\WinIoCtl.h に定義されています。
北さんへ
ありがとうございます。
そうですよね、VC++をインストールしてヘッダファイル探せば良かったんですよね。
バカな質問でお手数を取りました。申し訳ないです。
これでなんとかなりそうです。ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板