打开设备

在使用设备之前,必须使用 打开 (MCI_OPEN) 命令对其进行初始化。 此命令将驱动程序加载到内存 ((如果尚未加载) ),并检索用于在后续 MCI 命令中标识设备的设备标识符。 在使用新的设备标识符之前,应检查 mciSendStringmciSendCommand 函数的返回值,以确保标识符有效。 (还可以使用 mciGetDeviceID 函数检索设备标识符。)

与所有 MCI 命令消息一样, MCI_OPEN 具有关联的结构。 这些结构有时称为 参数块MCI_OPEN的默认结构为 MCI_OPEN_PARMS。 某些设备 ((如 波形覆盖) )具有扩展结构, (如 MCI_WAVE_OPEN_PARMSMCI_OVLY_OPEN_PARMS) 以适应其他可选参数。 除非需要使用这些附加参数,否则可以将 MCI_OPEN_PARMS 结构用于任何 MCI 设备。

可以打开的设备数仅受可用内存量的限制。

使用别名

打开设备时,可以使用“别名”标志为设备指定设备标识符。 此标志允许为具有较长文件名的复合设备分配短设备标识符,并允许打开同一文件或设备的多个实例。

例如,以下命令将设备标识符“birdcall”分配给冗长的文件名 C:\NABIRDS\SOUNDS\MOCKMTNG。Wav:

mciSendString(
    "open c:\nabirds\sounds\mockmtng.wav type waveaudio alias birdcall", 
    lpszReturnString, lstrlen(lpszReturnString), NULL);

在命令消息接口中,使用 MCI_OPEN_PARMS 结构的 lpstrAlias 成员指定别名。

指定设备类型

打开设备时,可以使用“type”标志来引用设备类型,而不是特定设备驱动程序。 以下示例打开波形音频文件 C:\WINDOWS\CHIMES。WAV (使用“type”标志指定 waveaudio 设备类型) 并分配别名“chimes”:

mciSendString(
    "open c:\windows\chimes.wav type waveaudio alias chimes", 
    lpszReturnString, lstrlen(lpszReturnString), NULL);

在命令消息接口中,“type”标志的功能由 MCI_OPEN_PARMS 结构的 lpstrDeviceType 成员提供。

简单和复合设备

MCI 将设备驱动程序分类为 复合简单。 复合设备的驱动程序需要用于播放的数据文件的名称;简单设备的驱动程序不会。

简单设备包括 cdaudiovideodisc 设备。 可通过两种方法打开简单设备:

  • 指定指向以 null 结尾的字符串的指针,其中包含注册表或SYSTEM.INI文件中的设备名称。

    例如,可以使用以下命令打开 视频磁盘 设备:

    mciSendString("open videodisc", lpszReturnString, 
        lstrlen(lpszReturnString), NULL);

在本例中,“videodisc”是注册表或 SYSTEM.INI 的 [mci] 节中的设备名称。

  • 指定设备驱动程序的实际名称。 但是,使用设备驱动程序文件名打开设备会使应用程序特定于设备,并且可以阻止应用程序在系统配置更改时运行。 如果使用文件名,则无需指定完整路径或文件扩展名;MCI 假定驱动程序位于系统目录中,并且 具有 。DRV 文件扩展名。

复合设备包括 waveaudiosequencer 设备。 复合设备的数据有时称为 设备元素。 但是,本文档通常将此数据称为文件,即使在某些情况下,数据可能不存储为文件。

可通过三种方法打开复合设备:

  • 仅指定设备名称。 这样,无需关联文件名即可打开复合设备。 大多数复合设备仅处理 (MCI_GETDEVCAPS) 的功能,并在以这种方式打开命令时关闭 ( MCI_CLOSE) 命令。
  • 仅指定文件名。 设备名称根据注册表中的关联确定。
  • 指定文件名和设备名称。 MCI 会忽略注册表中的条目,并打开指定的设备名称。

若要将数据文件与特定设备相关联,可以指定文件名和设备名称。 例如,以下命令使用文件名 MYVOICE 打开 waveaudio 设备。Snd:

mciSendString("open myvoice.snd type waveaudio", lpszReturnString, 
    lstrlen(lpszReturnString), NULL);

在命令字符串接口中,还可以使用备用感叹号格式缩写设备名称规范,如 open 命令中所述。

使用文件扩展名打开设备

如果 打开 (MCI_OPEN) 命令仅指定文件名,则 MCI 使用文件扩展名从注册表或SYSTEM.INI文件的 [mci extensions] 部分中的列表中选择相应的设备。 [mci extensions] 部分中的条目使用以下形式:

= filename_extensiondevice_name

如果找到扩展并且未在 open 命令中指定设备名称,MCI 会隐式使用 device_name

以下示例演示了典型的 [mci extensions] 部分:

[mci extensions]
wav=waveaudio
mid=sequencer
rmi=sequencer

使用这些定义,如果发出以下命令,MCI 将打开 waveaudio 设备:

mciSendString("open train.wav", lpszReturnString, 
    lstrlen(lpszReturnString), NULL);

新建数据文件

若要创建新的数据文件,只需指定一个空白文件名即可。 在使用保存 (MCI_SAVE) 命令保存文件之前,MCI 不会保存新文件。 创建新文件时,必须在 打开 (MCI_OPEN) 命令 中包含设备别名。

以下示例打开一个新的 waveaudio 文件,启动和停止录制,然后保存并关闭该文件:

mciSendString("open new type waveaudio alias capture", lpszReturnString, 
    lstrlen(lpszReturnString), NULL);
mciSendString("record capture", lpszReturnString, 
    lstrlen(lpszReturnString), NULL);
mciSendString("stop capture", lpszReturnString, 
    lstrlen(lpszReturnString), NULL);
mciSendString("save capture orca.wav", lpszReturnString, 
    lstrlen(lpszReturnString), NULL);
mciSendString("close capture", lpszReturnString, 
    lstrlen(lpszReturnString), NULL);

可共享设备

open (MCI_OPEN) 命令的“可共享” (MCI_OPEN_SHAREABLE) 标志允许多个应用程序同时访问同一设备 (或文件) 和设备实例。 如果应用程序以可共享方式打开设备或文件,其他应用程序也可以通过将设备或文件作为可共享文件打开来访问它。 共享设备或文件使每个应用程序能够更改控制其运行状态的参数。 每次将设备或文件作为可共享打开时,MCI 都会返回唯一的设备标识符,即使标识符引用同一实例也是如此。

如果应用程序在未指定设备或文件可共享的情况下打开设备或文件,则在应用程序关闭设备或文件之前,任何其他应用程序都无法访问它。 此外,如果设备仅支持一个打开的实例,则如果指定可共享标志, open 命令将失败。

如果应用程序打开设备并指定该设备可共享,则应用程序不应对此设备的状态做出任何假设。 应用程序可能需要补偿访问设备的其他应用程序所做的更改。

大多数复合文件不可共享;但是,可以打开多个文件,也可以多次打开单个文件。 如果多次打开单个文件,MCI 会为每个文件创建一个独立的实例,每个实例都具有唯一的操作状态。

如果打开文件的多个实例,则必须为每个实例分配唯一的设备标识符。 可以使用别名(如以下部分所述)为每个文件分配唯一名称。