kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

忘れられたAPIシリーズ:MCI編

社本さんからいただいたコメントからまだMCIを使っている人がいてびっくりしてます(^^;。ふと思ったのですが、WindowsのAPIと呼ばれるものはコアのものや追加機能で入ったものを考えると、もう2,3000はあるんじゃないでしょうか?
その中には新しいものに取って代わられたものも結構あります。そんな忘れ去られたAPIを紹介していこうかなと。第一弾は話題にも出たMCI。もちろん私が全部正しいことを書いているとは限りませんので、間違っていることや補足があればコメントやトラックバックでどうぞ。

いつできたの?

Windows 3.0にMulti Media Extensionsという追加機能としてリリースされたのが初めてだったと記憶しています。

どんな機能があるの?

CD,Wave,MIDIといったマルチメディア関係のデバイスを統一的なAPIで扱えるようにしたものがMCI(Multimedia Command Interface)です。MCIにはメッセージタイプとコマンドタイプの二種類が使用できます。ユーザーが使用するAPIの代表的なものではmciSendString(),mciSendCommand()があります。

どうやって使うの?

リリースされた当初、mciSendString(),mciSendCommand()というAPIで機械をコントロールしていました。ライブラリは標準でリンクされないので、C/C++の場合、winmm.libというファイルをリンク対象に入れ、Mmsystem.hをincludeする必要があります。APIによって、宣言されているヘッダやライブラリが違うようです。MSDNライブラリを見て確認してください。
mciSendString()では"play [devicename] from 1000 to 2000 notify"などと、比較的人間にわかりやすい指定ができました。Windows 95ではMCIウィンドウという仕組みで、MCIのメッセージを受信する専用のウィンドウを作成して処理することもできるようになりました。APIではMCIWndCreate()となります。

どんなデバイスがコントロールできたの?

Windows 3.0の追加機能としてリリースされたときはCD,WAVE,MIDI,VCR,VideoDiscなどのデバイス*1がありました。また、Windows 3.1からはMMEが標準実装され、Video for Windowsという機能を追加すると、AVIのコントロールもできるようになりました。
また、MCIの仕様は難しいものではありません。コマンドを解釈するMCIのユーザラントのDLLと、デバイスをコントロールするドライバの実装をすれば、ユーザプログラム側があまり特別なことを行わなくてもコントロールすることができました。

今も使える?

使えます。Windows XPにもwinmm.dllをはじめとしたMCI関係のDLLがありますし、Windows Server 2003 x64 Editionにも64bit版のwinmm.dllが入っています。

なぜ使われなくなったの?

わかりませんが、たぶんユーザが高度なことを望みだして、MCIの範囲を超えてしまったのではないでしょうか。通常のAPIなので、.NETからでも充分使用することはできます。
特に2.0でやっとSystem.Mediaという名前空間が定義されましたが、サウンド関係のみのようです。お手軽にただAVIを表示したり、CDの演奏をかけたいといった用途だとManaged DirectXを持ち出す必要はありません:-)。MCIでも充分いけると思います。

*1:確かPioneerのRS-232C経由でコントロールできるLDもあったと記憶しています