レガシー Windows API(概要)について

ここで紹介しているAPIは、Windows95、Windows NT3.5時代のAPI群であり、最新のAPIは含まれていないことに注しして欲しい。なお、当時の解説書は現在よりもより詳細に解説しているため、参考になるはずである。

  • レイアウトを変換する際、崩れているページがあります。
  • 概要およびSampleコードはありますが、APIの解説はありません。

ご要望があれば旧版のWin32 API(HELP形式)をお譲りします。問い合わせフォームより申し込みください。

Windows API メディア コントロール インターフェイスの概要

Microsoft(R) Windows(TM) 用アプリケーションは、 メディア コントロール インターフェイス (MCI) によって、 オーディオ ハードウェアやビデオディスク プレーヤ、 アニメーション プレーヤなどのメディア デバイスをデバイスに依存せずに制御できます。このトピックでは、 MCIについて簡単に説明し、 Windows用アプリケーションでMCIを使う方法を示します。

MCIによって、 任意のメディア デバイスをデバイスに依存せずに仮想的に制御できる拡張可能なインターフェイスが実現されます。MCIはデバイスにはほとんど依存しないため、 Windowsのマルチメディア機能にアクセスするには、 低レベル関数ではなくMCIを使ってください。

次に示すトピックでは、 メディア コントロール インターフェイスに付いて説明しています。

MCIのアーキテクチャ

MCIプログラミング インターフェイス

MCIコマンド セット

MCIデバイスについて

MCIデバイスのオープン

コマンド メッセージについて

MCIコマンド メッセージの要約

コマンド メッセージの送信

デバイスのオープン

デバイスのクローズ

待機フラグと通知フラグの使用

MCIシステム情報の取得

コマンド文字列インターフェイスについて

MciSendStringによるコマンド文字列の送信

コマンド文字列に関する追加情報

異なる種類のオーディオ デバイスを制御するためのMCIの使い方については、 高レベル オーディオの概要を参照してください。

MCIのアーキテクチャ

拡張性を高めるため、 MCIは、 特別なMCIデバイス ドライバを使ってMCIコマンドを解釈、 実行するように設計されています。

MCIデバイス ドライバは、 直接に、 またはWindowsが用意している低レベル マルチメディア関数を使って、 メディア ハードウェアを制御します。ウェーブフォーム オーディオ デバイスやMIDIデバイスなど、 よく使われるデバイスは、 低レベル マルチメディア関数で制御されます。

MCIプログラミング インターフェイス

MCIは、 コマンド文字列とコマンド メッセージの2つのプログラミング インターフェイスを用意しています。

コマンド文字列インターフェイス

コマンド文字列インターフェイスは、 英語風のコマンドを使ってMCIデバイスと通信するためのインターフェイスです。たとえば、 次のコマンド文字列は、 TIMPANI.WAVという名前のWAVEファイルを再生します。

play timpani.wav

コマンド文字列インターフェイスは、 Microsoft(R) Visual Basic(TM) やAsymetrix(R) ToolBook(R) などの、 高レベルのプログラミング環境やオーサリング環境で使えるように設計されています。ユーザーがMCIデバイスを制御できるようにテキスト ベースのインターフェイスを提供するアプリケーションを作成する場合には、 コマンド文字列インターフェイスを使ってください。

コマンド メッセージ インターフェイス

コマンド メッセージ インターフェイスは、 メッセージの受け渡しによりMCIデバイスとの通信をするインターフェイスです。たとえば、 次のコード例は、 上記のコマンド文字列による例と同じ動作を実行します。

WORD wDeviceID;
MCI_PLAY_PARMS mciPlayParms;

mciSendCommand(wDeviceID, /* device identifier */
MCI_PLAY,/* command message*/
0,/* flags*/
(DWORD) (LPVOID) &mciPlayParms); /* structure*/

コマンド メッセージ インターフェイスは、 C言語インターフェイスを使ってマルチメディア デバイスを制御するアプリケーションで使えるように設計されています。マルチメディア デバイスを直接制御するアプリケーションを作成する場合には、 コマンド メッセージ インターフェイスを使ってください。

MCIコマンド セット

MCIコマンド セットは、 さまざまなメディア デバイスを制御するための汎用コマンド セットを意図して設計されたものです。たとえば、 ウェーブフォームのオーディオ ファイル、 ビデオディスクのトラック、 アニメーション シーケンスなどの再生を開始するMCIコマンドは同一です。ただし、 デバイスの中には、 フレーム単位での時刻形式を使うアニメーション プレーヤなど、 独自の機能を持つものがあります。このようなデバイスに対して、 MCIは、 特定のタイプのデバイスに固有な拡張コマンドを用意しています。

コマンド文字列インターフェイスのコマンドは、 MCIコマンド セットの要約として見ることができます。これらのコマンドは、 それぞれコマンド メッセージ インターフェイスの類似コマンドに置き換えることができます。たとえば、 コマンド文字列closeは、 コマンド メッセージMCI_CLOSEと同等です。

次に、 主なコマンドの概要を示します。

コマンド説明

capabilityデバイスの能力に関する情報を要求します。

close使用後のデバイスをクローズします。

infoデバイスに関連するハードウェアの説明などの、 デバイスに関する情報を要求します。

open使用するデバイスをオープンし、 初期化します。

pauseデバイスの再生や録音を一時停止します。

playデバイスの再生を開始します。

recordデバイスの録音を開始します。

resume一時停止中のデバイスの再生や録音を再開します。

seek現在のメディア内での位置を変更します。

set使用中の時刻形式などのデバイスのコントロール設定を変更します。

status再生中や一時停止などのデバイスの状態に関する情報を要求します。

stopデバイスの再生や録音を停止します。

MCIデバイスについて

MCIデバイス ドライバは、 「シンプル」デバイスと「コンパウンド」デバイスに分類されます。シンプル デバイスは、 再生にデータ ファイルを必要としないデバイスです。シンプル デバイスの例としては、 コンパクト ディスク オーディオやビデオディスク プレーヤなどがあります。コンパウンド デバイスは、 再生にデータ ファイルを必要とするデバイスです。コンパウンド デバイスの例としては、 MIDIシーケンサやウェーブフォーム オーディオ プレーヤなどがあります。コンパウンド デバイスに関連付けられているデータ ファイルは、 「デバイス エレメント」と呼ばれます。デバイス エレメントの例としては、 MIDIファイルやWAVEファイルなどがあります。

標準MCIデバイスの種類

共通のコマンド セットに応答するMCIデバイスのクラスは、 「デバイスの種類」により識別されます。現バージョンで定義されているデバイスの種類を次の表に示します。

デバイスの種類説明

animationアニメーション デバイス

cdaudioCDオーディオ プレーヤ

datデジタル オーディオ テープ プレーヤ

digitalvideoウィンドウ内デジタル ビデオ (GDIは使用しません)

other未定義のMCIデバイス

overlayオーバーレイ デバイス (ウィンドウ内アナログ ビデオ)

scannerイメージ スキャナ

sequencerMIDIシーケンサ

videodiscビデオディスク プレーヤ

waveaudioデジタイズされたウェーブフォーム ファイルを再生するオーディオ デバイス

デバイス名

ある1つのデバイスの種類に対して、 使用するコマンド セットは同じでも、 異なるデータ形式を使用するMCIドライバが複数存在する場合があります。たとえば、 animationデバイス用のMCIドライバには、 使用するコマンド セットは同じでも、 異なるファイル形式を扱うものがあります。MCIは「デバイス名」を使って、 MCIドライバを一意的に識別します。

デバイス名は、 レジストリの[mci32]セクションで指定され、 WindowsはこのセクションからすべてのMCIデバイス ドライバを識別します。次の例は、 典型的な[mci32]セクションの一部です。

[mci32]
WaveAudio=mciwave.dll
Sequencer=mciseq.dll
AVIVideo=mciavi.dll
CDAudio=mcicda.dll

MMMovie=mcimmp.dll

キー名 (等号の左側) は、 デバイス名です。キー名に対応する値 (等号の右側) は、 MCIドライバのファイル名を識別します。通常、 上記の例のwaveaudiosequencer cdaudioデバイスのように、 デバイス名は、 ドライバのデバイスの種類と同じになります。ただし、 AVIVideoデバイスはdigitalvideoデバイスですが、 固有のデバイス名を使っています。

[mci32]セクションにすでに存在するデバイス名を持つMCIドライバをインストールすると、 Windowsは新しいドライバのデバイス名に整数番号を付けて、 一意的なデバイス名を作成します。上記の例では、 cdaudioデバイス名を使ってインストールされるドライバにはcdaudio1というデバイス名が割り当てられます。第二のcdaudioデバイスには、 cdaudio2というデバイス名が割り当てられます。

MCIデバイスのオープン

MCIデバイスは、 使用する前にオープンすることで、 初期化しなければなりません。デバイスをオープンすることにより、 ドライバが (ロードされていなければ) メモリにロードされ、 以降のコマンドの中でこのデバイスを識別するための「デバイスID」が作成されます (デバイスIDはコマンド文字列インターフェイスでは使われません)。オープンするデバイスを指定するには、 次のような方法があります。

シンプル デバイスでは、 デバイス名を指定してデバイスをオープンします。

コンパウンド デバイスでは、 デバイス名、 デバイス エレメント、 またはその両方を指定してデバイスをオープンします。

たとえば、 次のコマンド文字列は、 デバイス名を指定して、 CDオーディオ デバイス (シンプル デバイス) をオープンします。

open cdaudio

次のコマンド文字列は、 デバイス名とデバイス エレメントを指定して、 ウェーブフォーム オーディオ デバイス (コンパウンド デバイス) をオープンします。

open bells.wav type waveaudio

次の例のように、 デバイス エレメントだけを指定して、 コンパウンド デバイスをオープンすることもできます。

open bells.wav

デバイス エレメントだけを指定してコンパウンド デバイスをオープンするとき、 MCIは、 デバイス エレメント ファイル名の拡張子を使って、 どのデバイスをオープンするかを判断します。WIN.INIファイルには、 ファイル拡張子とそれに対応するMCIデバイスの種類とを関連付ける[mci extensions]セクションがあります。[mci extensions]セクションの一部を次に示します。

[mci extensions]
Wav=WaveAudio
Mid=Sequencer
rmi=Sequencer
avi=avivideo

コマンド メッセージ インターフェイスの使用

MCIに対するC言語インターフェイスが必要なアプリケーションでは、 コマンド メッセージ インターフェイスを使います。このインターフェイスの背景と詳しい使い方については、 次のトピックを参照してください。

コマンド メッセージについて

MCIコマンド メッセージの要約

コマンド メッセージの送信

デバイスのオープン

デバイスのクローズ

待機フラグと通知フラグの使用

MCIシステム情報の取得

コマンド文字列インターフェイスについて

コマンド文字列の送信

コマンド文字列に関する追加情報

コマンド メッセージについて

MCIコマンド メッセージは、 次の3つの要素で構成されます。

定数メッセージ値

コマンドの追加パラメータを指定する構造体 (パラメータ ブロック)

コマンドのオプションを指定したり、 構造体内のメンバを有効にしたりするフラグのセット

コマンドは、 mciSendCommand関数を使って送ります。この関数は、 メッセージ、 フラグ、 構造体のポインタの各パラメータを持ちます。mciSendCommand関数について詳しくは、 コマンド メッセージの送信を参照してください。

コマンド メッセージの例

MCIコマンド メッセージの例として、 MCI_PLAYコマンドの場合を次に示します。MMSYSTEM.Hヘッダー ファイルでは、 MCI_PLAYコマンド メッセージ、 MCI_PLAY_PARMS構造体、 フラグ (MCI_NOTIFYMCI_WAITMCI_FROMMCI_TO) が定義されています。MCI_PLAY_PARMS構造体の形式を次に示します。

typedef struct {
DWORDdwCallback;
DWORDdwFrom;
DWORDdwTo;
} MCI_PLAY_PARMS;

MCI_WAITフラグとMCI_NOTIFYフラグは省略可能です。MCI_WAITは、 コマンドが完了してからアプリケーションに制御を返すようにドライバに指示します。MCI_NOTIFYは、 コマンドが完了したときにアプリケーションに通知するようにドライバに指示します。これらのフラグの使用について詳しくは、 待機フラグと通知フラグの使用を参照してください。

MCI_FROMフラグとMCI_TOフラグは、 MCI_PLAY_PARMS構造体のdwFromメンバとdwToメンバを有効にします。これらのメンバは、 再生操作の開始点と終了点を指定します。どちらのフラグも省略可能です。これらのフラグを指定すると、 ドライバは、 パラメータ ブロック内の対応するメンバから開始点または終了点の値を取得します。フラグが指定されていなければ、 これらのメンバは無視されます。

: 対応するフラグを指定してメンバを有効にしないかぎり、 構造体のメンバは無視されます。

問い合わせコマンドの項目

デバイス情報を問い合わせるコマンドには、 MCI_GETDEVCAPSMCI_STATUS2つがあります。この2つのメッセージでは、 構造体にdwItemメンバを追加し、 そのメンバの項目定数を定義して、 コマンド メッセージ インターフェイスを拡張しています。項目の値は、 問い合わせる情報項目を示します。たとえばMMSYSTEM.Hでは、 MCI_STATUSコマンド メッセージのMCI_STATUS_PARMS構造体を次のように定義しています。

typedef struct {
DWORDdwCallback;
DWORDdwReturn;
DWORDdwItem;
DWORDdwTrack;
} MCI_STATUS_PARMS;

MCI_STATUS_ITEMフラグを使ってdwItemメンバを有効にするときは、 MMSYSTEM.Hで定義されている定数をdwItemに設定して、 要求する状態情報を正確に指定してください。MCI_STATUSコマンド メッセージは、 dwItemに次に示す定数を使います。

MCI_STATUS_CURRENT_TRACK

MCI_STATUS_LENGTH

MCI_STATUS_MEDIA_PRESENT

MCI_STATUS_MODE

MCI_STATUS_NUMBER_OF_TRACKS

MCI_STATUS_POSITION

MCI_STATUS_READY

MCI_STATUS_TIME_FORMAT

MCIコマンド メッセージの要約

MCIは、 4種類のコマンド メッセージを定義しています。次の2種類のコマンド メッセージとオプションは、 MCIドライバが必ずサポートしている最小限のコマンド セットです。

「システム コマンド メッセージ」。ドライバではなく、 MCIが直接処理します。

「必須コマンド メッセージ」。ドライバが処理します。すべてのドライバは、 必須コマンドとそのオプションをサポートします。

上記の2つのグループに属するコマンドとオプションは、 使用するドライバの種類に関わらず、 使用可能です。

次の2種類のコマンド メッセージは、 サポートしていないドライバもあります。

「基本コマンド メッセージ」(オプション コマンド)。このコマンドは一部のデバイスで使われます。基本コマンドをサポートするデバイスは、 コマンドに定義されているオプションのセットもサポートしなければなりません。

「拡張コマンド メッセージ」。このコマンドは、 特定のデバイスの種類やドライバに固有のコマンドです。拡張コマンドには、 新規のコマンド (animationデバイス タイプ用のMCI_PUTコマンド、 MCI_WHEREコマンドなど) や、 既存のコマンドの拡張機能 (animationデバイス タイプ用のMCI_STATUSコマンドに追加されているMCI_ANIM_GETDEVCAPS_CAN_STRETCHオプションなど) があります。

基本コマンドや拡張コマンドとそのオプションを使うときは、 それらを使おうとする前にデバイス ドライバに問い合わせる必要があります (開発中に使用していたMCIドライバがユーザーのシステムでも利用できるのであれば、 問い合わせの必要はありません)。以下の項では、 各グループに属するコマンドを表形式で示します。

システム コマンドは、 MCIデバイス ドライバに渡されずに、 MCIによって処理されます。システム コマンドを次に示します。

コマンド説明

MCI_BREAKMCIデバイスのブレーク キーを設定します。

MCI_SYSINFOMCIデバイスに関する情報を返します。

必須コマンドは、 すべてのMCIデバイス ドライバでサポートされる必要があります。必須コマンドを次に示します。

コマンド説明

MCI_CLOSEMCIデバイスをクローズします。

MCI_GETDEVCAPSMCIデバイスの能力を取得します。

MCI_INFOMCIデバイスから情報を取得します。

MCI_OPENMCIデバイスを初期化します。

MCI_STATUSMCIデバイスの状態情報を取得します。

基本コマンドは、 一部のデバイスがサポートします。基本コマンドを次に示します。

コマンド説明

MCI_LOADファイルからデータをロードします。

MCI_PAUSE再生や記録を一時停止します。

MCI_PLAY出力データの送出を開始します。

MCI_RECORDデータの記録を開始します。

MCI_RESUME再生や記録を再開します。

MCI_SAVEデータをディスク ファイルに保存します。

MCI_SEEK前方または後方にシークします。

MCI_SETデバイスの状態を設定します。

MCI_STATUSMCIデバイスの状態情報を取得します (このコマンドは、 必須コマンドのMCI_STATUSコマンドに、 位置の識別が可能な一次元メディアを使用するデバイスのオプションを付加したものです)。

MCI_STOP再生や記録を停止します。

MCIデバイスには、 既存のコマンドのほかに、 さらにコマンドやオプションを持つものもあります。一部の拡張コマンドは特定のデバイス ドライバにしか適用されませんが、 ほとんどの拡張コマンドはそのデバイスの種類のすべてのドライバに適用されます。たとえば、 sequencerコマンド セットは、 MCI_SETコマンドを拡張して、 MIDIシーケンサに必要な時刻形式を追加します。

開発中に使用した特定のMCIドライバがユーザーのシステムでも確実に利用できるものでなければ、 デバイスが拡張コマンドや拡張オプションをサポートしていると仮定することはできません。特定の機能がサポートされているかどうかを調べるには、 MCI_GETDEVCAPSコマンドを使います。アプリケーションは、 戻り値MCIERR_UNSUPPORTED_FUNCTIONを処理できるように設計してください。

特定のデバイスの種類で使用可能な拡張コマンドを次に示します。

コマンドデバイスの種類説明

MCI_CUEwaveaudio再生や記録の準備をします。

MCI_DELETEwaveaudioメディア エレメントからデータ セグメントを除去します。

MCI_ESCAPEvideodiscカスタム情報をデバイスに送ります。

MCI_FREEZEoverlayフレーム バッファへのビデオ取得を禁止します。

MCI_PUTanimationoverlay転送元、 転送先、 フレームの各ウィンドウを定義します。

MCI_REALIZEanimationデバイスが、 表示されているウィンドウのディスプレイ コンテキストにパレットを選択して、 実現するようにします。

MCI_SPINvideodiscディスクの回転を開始または停止します。

MCI_STEPanimationvideodiscフレーム単位で前後方向の再生を実行します。

MCI_UNFREEZEoverlayフレーム バッファへのビデオ データの取得を再開します。

MCI_UPDATEanimation現在のフレームをディスプレイ コンテキストに再描画します。

MCI_WHEREanimationoverlay転送元、 転送先、 フレームの各領域を指定する長方形を取得します。

MCI_WINDOWanimationoverlayタイトル テキストなどの、 表示ウィンドウのオプションを制御します。

コマンド メッセージの送信

Windowsは、 デバイスへのコマンド メッセージの送信、 およびエラー情報の問い合わせのための次の関数を用意しています。

関数説明

mciSendCommandMCIデバイスにコマンド メッセージを送ります。

mciGetErrorStringMCIエラーの戻り値に対応するエラー文字列を返します。

MCIデバイスID

MCI_OPENコマンドを使ってデバイスをオープンすると、 MCIはデバイスIDを返します。オープンした後は、 コマンドを送るときにこのIDを使い、 オープンされているデバイスを識別してください。

MMSYSTEM.Hには、 特別な定数MCI_ALL_DEVICE_IDが定義されています。この定数は、 アプリケーションがオープンしたすべてのMCIデバイスにコマンドを送ることを示すものです。MCI_ALL_DEVICE_IDは、 情報を返さないコマンドとともに使うことができます。たとえば、 次のコード例は、 アプリケーションがオープンしたMCIデバイスをすべてクローズします。

DWORD dwReturn;

/*
* Closes all MCI devices opened by this application.
* Waits until devices are closed before returning.
*/
if (dwReturn = mciSendCommand(MCI_ALL_DEVICE_ID, MCI_CLOSE,
MCI_WAIT, NULL))
/* Error, unable to close all devices. */
return FALSE;

: すべてのデバイスにコマンドを送るときにMCI_ALL_DEVICE_ID識別子を使用すると非常に便利ですが、 デバイスを同期させるときはこの識別子を使わないでください。各デバイスに送られる個々のメッセージのタイミングは一定していないため、 この識別子を使って同期することはできません。

デバイスのオープン

アプリケーションは、 デバイスを使用する前に、 MCI_OPENコマンド メッセージを使ってデバイスを初期化しなければなりません。このコマンドはMCIコマンドの中でも最も複雑なものの1つであり、 さまざまな派生コマンドがあります。

MCI_OPEN_PARMS構造体

ほかのMCIコマンド メッセージと同じように、 MCI_OPENコマンドにも、 対応する構造体があります。MCI_OPENのデフォルトの構造体は、 MCI_OPEN_PARMS構造体です。waveformanimation overlayなどの一部のデバイスには拡張構造体があり、 追加のオプション パラメータに対応できるようになっています。このような追加パラメータを使用する必要がなければ、 すべてのMCIデバイスでMCI_OPEN_PARMS構造体を使うことができます。

MCIは、 この構造体のwDeviceIDメンバを使って、 デバイスIDをアプリケーションに返します。デバイスIDを使うときは、 まずmciSendCommand関数の戻り値を調べて、 デバイスIDが有効かどうかを確かめる必要があります。戻り値が0以外の値であれば、 オープン中にエラーが発生したことを示しています。

: mciGetDeviceID関数にデバイス名を指定してデバイスIDを調べることもできます。

デバイスのオープンに使われるほかのメンバは、 コマンドの次のフラグに対応しています。

フラグ説明

MCI_OPEN_ALIAS構造体のlpstrAliasメンバが、 デバイスのエイリアスを指すポインタであることを示します。

MCI_OPEN_ELEMENT構造体のlpstrElementNameメンバが、 エレメント名を指すポインタであることを示します。

MCI_OPEN_SHAREABLEデバイスやデバイス エレメントを共有可能な状態でオープンすることを示します。

MCI_OPEN_TYPE構造体のlpstrDeviceTypeメンバが、 デバイスの種類名を指すポインタであることを示します。

MCI_OPEN_TYPE_ID構造体のlpstrDeviceTypeメンバが、 整数のデバイス タイプIDであることを示します。

シンプル デバイスのオープン

CDオーディオやビデオディスク デバイスなどのシンプル デバイスをオープンするには、 MCI_OPEN_PARMS構造体のlpstrDeviceTypeメンバを使って、 オープンするデバイスを指定します。デバイスを識別する方法には、 次の3つがあります。

デバイス名を含む、 NULLで終わる文字列を指すポインタを指定する

デバイスの種類を表す定数を指定する

デバイス ドライバの実際の名前を指定する

いずれの場合も、 MCI_OPEN_TYPEフラグを指定して、 lpstrDeviceTypeメンバを有効にしてください。たとえば、 次のコード例は、 デバイス名を指定して、 CDオーディオ デバイスをオープンします。

UINT wDeviceID;
DWORD dwReturn;
MCI_OPEN_PARMS mciOpenParms;

/* Open a compact disc device by specifying the device name. */

mciOpenParms.lpstrDeviceType = "cdaudio";
if (dwReturn = mciSendCommand(NULL, MCI_OPEN, MCI_OPEN_TYPE,
(DWORD)(LPVOID) &mciOpenParms))
/* Error, unable to open device. */
return FALSE;

/* Device opened successfully. Get the device ID. */
wDeviceID = mciOpenParms.wDeviceID;

また、 デバイス タイプ定数を使ってデバイスをオープンすることもできます。次の表に、 さまざまなデバイスのデバイス タイプ定数を示します。デバイス タイプ定数を使ってオープンするには、 この表にあるデバイス名を使ってレジストリの[mci]セクションにデバイス ドライバがインストールされていなければなりません。

デバイス名デバイス タイプ定数

animation MCI_DEVTYPE_ANIMATION

cdaudio MCI_DEVTYPE_CD_AUDIO

datMCI_DEVTYPE_DAT

digitalvideo MCI_DEVTYPE_DIGITAL_VIDEO

otherMCI_DEVTYPE_OTHER

overlay MCI_DEVTYPE_OVERLAY

scanner MCI_DEVTYPE_SCANNER

sequencer MCI_DEVTYPE_SEQUENCER

videodisc MCI_DEVTYPE_VIDEODISC

waveaudio MCI_DEVTYPE_WAVEFORM_AUDIO

デバイス タイプ定数を指定してデバイスをオープンするときは、 MCI_OPEN_TYPEフラグに加えてMCI_OPEN_TYPE_IDを指定してください。たとえば、 次のコード例は、 デバイス タイプ定数を指定して、 CDオーディオ デバイスをオープンします。

UINT wDeviceID;
DWORD dwReturn;
MCI_OPEN_PARMS mciOpenParms;

/*
* Open a compact disc device by
* specifying a device-type constant.
*/

mciOpenParms.lpstrDeviceType = (LPCSTR) MCI_DEVTYPE_CD_AUDIO;
if (dwReturn = mciSendCommand(NULL, MCI_OPEN,
MCI_OPEN_TYPE | MCI_OPEN_TYPE_ID,
(DWORD)(LPVOID) &mciOpenParms))
/* Error, unable to open device. */
return FALSE;

/* Device opened successfully. Get the device ID. */
wDeviceID = mciOpenParms.wDeviceID;

デバイス タイプ定数を指定してデバイスをオープンする場合、 MCIは、 lpstrDeviceTypeメンバの上位ワードを使って、 レジストリ内の複数のデバイスの種類を区別します。

たとえば、 レジストリにwaveaudio1waveaudio2のエントリがリストされているとき、 次の文は、 waveaudio2に登録されているデバイスをlpdtrDeviceTypeメンバに設定します。

LPSTR lpstrDeviceType;

lpstrDeviceType = (LPSTR)MAKELONG(MCI_DEVTYPE_WAVEFORM_AUDIO, 2);

同じように、 waveaudio1が識別するデバイスを指定するには、 lpstrDeviceTypeの上位ワードに0または1を設定します (上位ワードに0を設定すると、 MCIは、 番号を持たないデバイス、 または最も小さい番号のデバイスを使います)。

MCI_OPEN_PARMS構造体のlpstrDeviceTypeメンバにデバイス ドライバのファイル名を指定する方法でも、 デバイスをオープンできます。完全なパス名や拡張子を指定する必要はありません。MCIは、 ドライバがWindowsのシステム ディレクトリにあり、 DRVという拡張子を持っていると仮定しています。

:デバイス ドライバのファイル名を指定してMCIデバイスをオープンする方法は、 開発時やテストの場合には便利です。しかし、 アプリケーションでこの方法を使用するとデバイスに依存することになります。このため、 アプリケーションではなるべくこの方法を使わないようにしてください。ファイル名を使ってMCIデバイスをオープンするアプリケーションは、 システムにより動作しないことがあります。

コンパウンド デバイスのオープン

コンパウンド デバイスをオープンする方法には、 次の3つがあります。

(デバイス名、 デバイス タイプ定数、 またはデバイス ドライバのファイル名を使って) デバイスだけを指定する

デバイスとデバイス エレメントの両方を指定する

デバイス エレメントだけを指定する

MCI_GETDEVCAPSコマンドを使ってデバイスの能力を判断するには、 デバイスだけを指定する最初の方法が便利です。実際にメディア デバイスを制御するときには、 デバイスのオープン時にデバイス エレメントを指定してください。

デバイス エレメントを指定するときは、 MCI_OPEN_PARMS構造体のlpstrElementNameメンバに、 デバイス エレメントのファイル名を含む、 NULLで終了する文字列を指すポインタを指定します。また、 mciSendCommand関数のdwFlagsパラメータにMCI_OPEN_ELEMENTを指定して、 lpstrElementNameを有効にしておきます。

デバイスを指定するときは、 シンプル デバイスと同じ方法で、 デバイス名、 デバイス タイプ定数、 またはドライバのファイル名で指定します。たとえば、 次のコードは、 "TIMPANI.WAV"という名前のWAVEファイルで、 ウェーブフォーム オーディオ デバイスをオープンします。

UINT wDeviceID;
DWORD dwReturn;
MCI_OPEN_PARMS mciOpenParms;

/*
* Open a waveaudio device by specifying
* the device name and device element.
*/

mciOpenParms.lpstrDeviceType = "waveaudio";
mciOpenParms.lpstrElementName = "timpani.wav";
if (dwReturn = mciSendCommand(NULL, MCI_OPEN,
MCI_OPEN_TYPE | MCI_OPEN_ELEMENT,
(DWORD)(LPVOID) &mciOpenParms))
/* Error, unable to open device. */
return FALSE;

/* Device opened successfully. Get the device ID. */
wDeviceID = mciOpenParms.wDeviceID;

デバイス エレメントだけを指定してデバイスをオープンすることもできます。MCIは、 レジストリの[mciextensions]セクションで指定されているデバイス エレメントのファイル名拡張子を使って、 オープンするデバイスを選択します。デバイス エレメントだけを指定してデバイスをオープンする方法について詳しくは、 MCIデバイスのオープンを参照してください。

デバイスのクローズ

MCI_CLOSEコマンド メッセージは、 デバイスやデバイス エレメントへのアクセスを解除します。そのデバイスを使用しているすべてのプロセスがデバイスをクローズすると、 MCIはデバイスを解放します。MCIがデバイスを適切に管理できるようにするため、 アプリケーションは、 デバイスやデバイス エレメントを使い終わったら、 明示的にクローズしてください。

: アプリケーションが終了する前に、 オープンしたMCIデバイスをすべてクローズすることは非常に重要です。デバイスIDとしてMCI_ALL_DEVICE_ID定数を指定すれば、 1つのコマンドですべてのデバイスをクローズできます。

待機フラグと通知フラグの使用

通常、 コマンドの実行により開始された動作が完了するまでに数秒かかるような場合でも、 MCIは即座にアプリケーションに制御を返します。たとえば、 CDオーディオ デバイスがシーク コマンドを受け取ると、 シークが完了する前に、 コマンドを送ったアプリケーションに制御が戻ります。これに対し、 次に示す2つのフラグを使うと、 コマンドが完了してからアプリケーションに制御が戻るようにしたり、 コマンドが完了したことをアプリケーションに通知するようにできます。

フラグ意味

MCI_NOTIFY制御をすぐに戻し、 要求された動作が完了したときにMM_MCINOTIFYメッセージをポストするようにデバイスに指示します。

MCI_WAIT要求された動作が完了するまで、 アプリケーションに制御を戻さないようにデバイスに指示します。

通知フラグの使用

MCI_NOTIFYフラグは、 動作の完了時にMM_MCINOTIFYメッセージをポストするようMCIに指示します。アプリケーションでは、 コマンド メッセージとともに送る構造体のdwCallbackメンバの下位ワードに、 メッセージの送り先のウィンドウのハンドルを指定します。コマンド メッセージに対応する構造体には、 このメンバが必ずあります。

: MCIは、 各デバイスに対して、 一度に1つの通知メッセージしか処理できません。

MCIは、 MM_MCINOTIFYメッセージをポストするとき、 ウィンドウ プロシージャのlParamパラメータの下位ワードに、 コールバックを実行させたデバイスのIDを設定します。また、 ウィンドウ プロシージャのwParamパラメータには、 コールバックの通知状態を示す次のいずれかの定数を設定します。

フラグ説明

MCI_NOTIFY_SUCCESSFULコールバックの実行に必要な条件が満たされ、 割り込みなしでコマンドの実行が完了したことを示します。

MCI_NOTIFY_SUPERSEDEDコールバック待ち状態の通知があるときに、 ほかの通知要求を受け取ったことを示します。MCIは新しいコマンドの通知要求に従って、 コールバック条件を再設定します。

MCI_NOTIFY_ABORTED以前のコマンドで設定したコールバック条件を無効にする新しいコマンドが、 アプリケーションから送られたことを示します。通知要求に対してアプリケーションが割り込みをかけた場合、 MCIは、 通知コマンドの実行が中断されたことをウィンドウ プロシージャに知らせません。

MCI_NOTIFY_FAILUREデバイスがMCIコマンドを実行しているときにデバイス エラーが発生したことを示します。たとえば、 再生コマンドの実行中にハードウェア エラーが発生すると、 MCIはこのメッセージをポストします。

待機フラグとブレーク コマンド メッセージの使用

コマンドにMCI_WAITフラグを指定すると、 MCIは、 コマンドの実行が完了してからアプリケーションに制御を戻します。動作が完了するまでに長い時間を要するコマンドで待機フラグを使うと、 コマンドが完了するまでシステムはユーザーからの入力を受け取らなくなります。

MCIは、 待機動作に割り込んでアプリケーションに制御を戻すブレーク キーをサポートしています。ブレーク キーはコマンドの実行を妨げるものではなく、 アプリケーションに制御を戻すことにより、 アプリケーションがユーザー入力を監視できるようにするものです。

デフォルトでは、 ブレーク キーはCtrl+Breakキーに定義されています。アプリケーションは、 MCI_BREAKコマンドを使ってこのキーを再定義できます。MCI_BREAKコマンドは、 MCI_BREAK_PARMS構造体を使います。

次のフラグは、 MCI_BREAK_PARMS構造体の対応するメンバを有効にします。

フラグ意味

MCI_BREAK_HWNDブレーク検出を有効にするためにフォーカスを持たなければならないウィンドウを指定する、 hwndBreakメンバを有効にします。

MCI_BREAK_KEYブレーク キーとして使われる仮想キー コードを指定する、 nVirtKeyメンバを有効にします。

MCI_BREAK_OFF既存のブレーク キーをすべて使用不能にします。

MCIシステム情報の取得

MCI_SYSINFOメッセージは、 MCIデバイスに関するシステム情報を取得します。MCIは、 このメッセージをMCIデバイスに中継せずに処理します。MCIは、 システム情報をMCI_SYSINFO_PARMS構造体に返します。

MCI_SYSINFOコマンド メッセージには、 次のようなフラグがあります。

フラグ意味

MCI_SYSINFO_QUANTITYMCIは、 レジストリの[mci]セクションにリストされている特定のデバイスの種類のデバイスの個数を返します。MCI_SYSINFO_OPENフラグとともに使うと、 オープンされているデバイスの個数が返されます。

MCI_SYSINFO_NAMEMCIは、 問い合わせを満足するデバイスの名前を返します。MCI_SYSINFO_OPENフラグとともに使うと、 オープンされているデバイスの名前だけが返されます。

MCI_SYSINFO_OPENMCIは、 オープンされているデバイスの個数または名前を返します。

MCI_SYSINFO_INSTALLNAMEMCIは、 デバイスのインストールに使われた、 レジストリにリストされている名前を返します。

レジストリの[mci]セクションにリストされている特定の種類のデバイスの個数を判断するには、 MCI_SYSINFO_QUANTITYフラグを使います。このフラグの場合、 構造体のwDeviceTypeフィールドにデバイスの種類を設定してください。デバイスの個数を調べるには、 wDeviceIDパラメータにNULLを設定してください。MCIは、 構造体のlpstrReturnフィールドに、 デバイスの個数をDWORDで返します。MCI_SYSINFO_QUANTITYフラグをMCI_SYSINFO_OPENフラグと組み合わせて指定すると、 MCIは、 プロセスでオープンされているその種類のデバイスの個数を返します。

デバイスの個数を取得したら、 MCI_SYSINFO_NAMEフラグを使ってデバイス名を列挙できます。このフラグを使って情報を取得するには、 返されるデバイス名のためのバッファを作成しなければなりません。バッファを指すポインタ、 バッファのサイズ、 デバイスに対応するインデックス番号 (最初のデバイスは1です)、 デバイスの種類を構造体に設定してください。これらの情報は、 それぞれlpstrReturndwRetSize dwNumberwDeviceTypeの各フィールドに設定します。MCIは、 バッファにデバイス名を返します。特定のデバイスの名前を要求するときは、 wDeviceIDパラメータにNULLを設定してください。オープンされているデバイスの名前に限定するには、 MCI_SYSINFO_OPENフラグとMCI_SYSINFO_NAMEフラグを使ってください。

システムのすべてのデバイスに関する情報を取得するには、 wDeviceIDパラメータにMCI_ALL_DEVICE_IDを設定してください。この識別子を使用すると、 MCIはwDeviceTypeフィールドの内容を無視し、 レジストリにリストされているすべてのMCIデバイスに関する情報を返します。MCI_SYSINFO_OPENフラグをMCI_ALL_DEVICE_ID識別子とともに使用すると、 MCIは、 プロセスがオープンしたデバイスに関する情報を返します。

オープンされているデバイスのインストール時の名前は、 MCI_SYSINFO_INSTALLNAMEフラグで取得できます。インストール時の名前を取得するには、 返される名前のためのバッファを作成しなければなりません。バッファを指すポインタとバッファのサイズを、 構造体のlpstrReturnフィールドとdwRetSizeフィールドに設定してください。MCIは、 wDeviceIDパラメータに対応するデバイス名をバッファに設定します。

コマンド文字列インターフェイスについて

ここでは、 コマンド文字列インターフェイスについて説明します。MCIは、 コマンド文字列を使うための次のような関数を用意しています。

関数説明

mciSendStringコマンド文字列をMCIデバイス ドライバに送ります。この関数には、 コールバック関数パラメータと返される文字列のパラメータもあります。

mciGetErrorStringエラー番号に対応するエラー文字列を返します。

コマンド文字列の送信

デバイスにコマンド文字列を送るには、 mciSendString関数を使います。

次の文は、 ウェーブフォーム デバイス ドライバにplay to 500というコマンドを渡します。

DWORD dwErrorCode;
dwErrorCode = mciSendString("play waveaudio to 500", NULL, 0, 0L);

mciSendString関数は、 正常に終了すると0を返します。失敗したときは、 エラーコードを返します。拡張エラー情報を取得するには、 mciGetErrorString関数を使います。

コマンド文字列に関する追加情報

MCITESTアプリケーションは、 mciSendString関数やmciGetErrorString関数の使い方の例です。このアプリケーションを使って、 MCIデバイスやMCIコマンド文字列を試すことができます。

▲ページトップに戻る

【本を読んでもよくらからない】 … 個別指導でわかりやすくお教えします