PlaySound

MSDN API链接

函数功能

播放由给定的文件名,资源或系统事件指定声音。

函数原型

BOOL PlaySound(
   LPCTSTR pszSound,
   HMODULE hmod,
   DWORD   fdwSound
);

头文件

#include <Windows.h>
#include <mmsystem.h>
#pragma comment (lib, "winmm.lib")

参数以及查常用选择

  • pszSound — 指定要播放的声音
    • NULL 停止所有声音播放
    • 音乐文件的路径(参数3必须有SND_FILENAME)
    • 音乐文件资源ID(参数3必须有SND_RESOURCE)
  • hmod — 指向包含要加载资源的可执行文件的句柄
    • NULL
    • 当前窗口实例句柄(官网上例子:GetModuleHandle(NULL)
  • fdwSound — 用于播放声音的标志
    • SND_FILENAME:通过文件名播放音乐
    • SND_RESOURCE:通过资源标识符播放音乐,(音乐会编译进exe文件,不推荐使用)
    • SND_ASYNC:异步播放
    • SND_LOOP:循环播放

返回值

  • true — 成功
  • false — 失败

使用

使用文件名播放

#include <stdio.h>
#include <Windows.h>
#include <mmsystem.h>

#pragma comment (lib,"winmm.lib")

int main(void)
{
	if (0 == PlaySound(TEXT("亡灵序曲+-+The+Dawn.wav"), NULL, SND_FILENAME | SND_ASYNC))
	{
		printf("playsound false");
	}

	system("pause");
	return 0;
}

使用资源标识符播放

添加资源文件:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
记得保存一下

在添加资源的时候系统会自动创建资源头文件:
在这里插入图片描述
在里面可以找到资源标识符
在这里插入图片描述
程序:

#include <stdio.h>
#include <Windows.h>
#include <mmsystem.h>

#include "resource.h"

#pragma comment (lib,"winmm.lib")

int main(void)
{
	if (0 == PlaySound(MAKEINTRESOURCE(IDR_WAVE1), NULL, SND_RESOURCE | SND_ASYNC))
	{
		printf("playsound false");
	}

	system("pause");
	return 0;
}

mciSendString

MSDN API链接

函数功能

发送一个命令串到MCI设备。用来播放多媒体文件的API指令。

函数原型

MCIERROR mciSendString(
   LPCTSTR lpszCommand,
   LPTSTR  lpszReturnString,
   UINT    cchReturn,
   HANDLE  hwndCallback
);

头文件

#include <Windows.h>
#include <mmsystem.h>
#pragma comment (lib, "winmm.lib")

参数解释

  • lpszCommand — 要发送的命令字符串。字符串结构是:[命令][设备别名][命令参数]
  • lpszReturnString — 返回信息的缓冲区(指定了大小的字符串变量)
  • cchReturn — 缓冲区的大小(参数二字符变量的长度)
  • hwndCallback — 回调窗口的句柄(一般设为零)

返回值

  • 0 — 执行成功
  • 错误代码(返回的DWORD值的低位字包含错误返回值。如果错误是特定于设备的,则返回值的高位字是驱动程序标识符;否则,高阶字为零。) — 执行错误

错误码获取

BOOL mciGetErrorString(
  DWORD fdwError,  	  // 函数mciSendString返回的错误码
  LPTSTR lpszErrorText,  // 接收描述错误的字符串的缓冲区
  UINT  cchErrorText   // 缓冲区的长度
);

lpszCommand常用选择

1、MCI命令

使用MCI设备一般包括打开、使用和关闭三个过程,常用的MCI命令有:

命令解释
open打开设备
close关闭设备
play开始设备播放
stop停止设备的播放或记录
record开始记录
save保存设备内容
pause暂停设备的播放或记录
resume恢复暂停播放或记录的设备
seek改变媒体的当前位置
capacility查询设备能力
info查询设备的信息
status查询设备状态信息

MCI的大部分命令可以控制不同的媒体设备,但其中record和save命令并不是所有MCI设备都可以使用。

MCI命令的使用是很随意的,只要先打开,最后关闭,中间可以随意调用各种命令。

2、MCI设备

MCI的设备类型如下:

设备类型解释
animation动画设备
cdaudioCD播放器
dat数字音频磁带机
digitalvideo某一窗口中的数字视频(不基于GDI)
other未定义的MCI设备
overlay重叠设备(窗口中的模拟视频)
scanner图象扫描仪
sequencerMIDI序列器
videodisc视盘机
waveaudio播放数字波形文件的音频设备

3、设备名

设备名是在注册表或SYSTEM.INI的[mci]部分定义的,典型的[mci]段如下:

cdaudio=mcicda.drv
sequencer=mciseq.drv
waveaudio=mciwave.drv
avivideo=mciavi.drv
videodisc=mcipionr.drv

等号的左边是设备名,右边是对应的MCI驱动程序。当安装了新的MCI驱动程序时,系统要用不同的设备名来区分。

播放mp3的操作

1、打开

"open mName type MPEGVideo Alias movie parent %u Style %u notify"

命令解释
open操作命令
mName全路径文件名
type MPEGVideo是指打开MPEG,AVI等类型,如果不加这一句,就是打开WAV,MP3等
Alias movie定义了该操作的别名为movie,后续操作只要指明别名即可
parent %u
Style %u风格、样式
notify通知

2、播放

命令解释
"Play 设备名 [from 起点][to 终点]"播放一部分一次
"play movie" 播放一次
"play movie repeat"循环播放

3、暂停

"pause movie"

4、继续

"resume movie"

5、停止

"stop movie"

6、关闭

"close movie"

7、获取当前播放信息

命令解释
"status movie position"播放位置
"status movie length"播放总长度
"status movie mode"播放状态

8、设置当前播放位置

命令解释
"seek movie to "指定位置
"seek movie to start"定位到开头位置
"seek movie to end"定位到最后位置

代码

#include <stdio.h>
#include <Windows.h>
#include <mmsystem.h>
#include <strsafe.h>

#pragma comment (lib,"winmm.lib")

#define CLEAR_BUF \
    {\
    int ch; \
while ((ch = getchar()) != EOF && ch != '\n')\
        {\
        ; \
        }\
    }

// 显示命令
void ShowOrder()
{
	system("cls");
	printf("mciSendString order:\n");
	printf("1.open music\n");
	printf("2.close music\n");
	printf("3.play music\n");
	printf("33.play music repeat\n");
	printf("4.stop music\n");
	printf("5.pause music\n");
	printf("6.resume music\n");
	printf("7.status music position\n");
	printf("8.seek to position\n");
	printf("9.view playback status\n");

	printf("0.out\n");
	printf("Enter Your Choice:\n");
}

void MymciSendString(const char* szCommand, char* szbuffer)
{
	if (NULL == szbuffer)
	{
		if (0 != mciSendString(szCommand, NULL, 0, NULL))
		{
			printf("%s false!\n", szCommand);
		}
		else
		{
			printf("%s success!\n", szCommand);
		}
	}
	else
	{
		if (0 != mciSendString(szCommand, szbuffer, 1024, NULL))
		{
			printf("%s false!\n", szCommand);
		}
		else
		{
			printf("%s success!\n", szCommand);
		}
	}
}

int main(void)
{
	int icommand = -1;
	_Bool bflag = 1;
	char szTimeBuffer[1024];
	char szModeBuffer[1024];
	char szCommandBuffer[1024];

	while (bflag)
	{
		ShowOrder();
		scanf_s("%d", &icommand);
		// 方法1
		//fflush(stdout);
		// 方法2
		CLEAR_BUF
		switch (icommand)
		{
		case 1:
			MymciSendString("open AAA-恋音と雨空.mp3 alias BackMusic", NULL);
			break;

		case 2:
			MymciSendString("close BackMusic", NULL);
			break;

		case 3:
			MymciSendString("play BackMusic", NULL);
			break;

		case 33:
			MymciSendString("play BackMusic repeat", NULL);
			break;

		case 4:
			MymciSendString("stop BackMusic", NULL);
			break;

		case 5:
			MymciSendString("pause BackMusic", NULL);
			break;

		case 6:
			MymciSendString("resume BackMusic", NULL);
			break;

		case 7:
			MymciSendString("status BackMusic position", szTimeBuffer);
			break;

		case 8:
			StringCchPrintf(szCommandBuffer, sizeof(szCommandBuffer) - 1, "seek BackMusic to %s", szTimeBuffer);
			MymciSendString(szCommandBuffer, NULL);
			break;

		case 9:
			MymciSendString("status BackMusic mode", szModeBuffer);
			printf("%s", szModeBuffer);
			break;

		case 0:
			bflag = 0;
			break;

		default:
			printf("Input error!Please enter again.");
			break;
		}

		printf("\n");
		system("pause");
	}
}

1 打开音乐和 2 关闭音乐是对应的 播放音乐之前要先打开音乐
3 播放音乐和 4 停止播放是对应的
5 暂停播放和 6 继续播放是对应的‘
7 获取当前播放的位置 之后 可以使用 8 定位到刚刚的位置 实现设置播放位置
9 查看播放的状态
逻辑功能还有欠缺,只是一些功能的测试。

程序运行效果(因为这里只能放gif没有声音):
在这里插入图片描述

mciSendCommand

MSDN API链接

函数功能

发送一个命令消息到指定的MCI设备。

函数原型

MCIERROR mciSendCommand(
   MCIDEVICEID IDDevice,
   UINT        uMsg,
   DWORD_PTR   fdwCommand,
   DWORD_PTR   dwParam
);

头文件

#include <Windows.h>
#include <mmsystem.h>
#pragma comment (lib, "winmm.lib")

参数解释

  • IDDevice — 要接收命令消息的MCI设备的设备标识符。该参数不与MCI_OPEN命令消息一起使用。
  • uMsg — 命令消息。
  • fdwCommand — 命令消息的标志。
  • dwParam — 指向包含命令消息参数的结构的指针。

有链接的为常用的

命令(参数二)结构(参数四)作 用
MCI_BREAKMCI_BREAK_PARMS为MCI设备设置一个中断键
MCI_CAPTUREMCI_DGV_CAPTURE_PARMS抓取当前帧并存入指定文件
MCI_CLOSEMCI_GENERIC_PARMS关闭设备,用于所有设备
MCI_CONFIGUREMCI_GENERIC_PARMS弹出配置对话框,仅用于数字视频(Digital-video)
MCI_COPYMCI_DGV_COPY_PARMS拷贝数据至剪贴板 仅用于数字视频
MCI_CUEMCI_GENERIC_PARMS延时播放或录音 用于Digital-video, VCR, 和 waveform-audio
MCI_CUTMCI_DGV_CUT_PARMS删除数据 ,并将数据复制到剪贴板 用于Digital-video
MCI_DELETEMCI_GENERIC_PARMS将文件中的数据删除 用于 Digital-video 和 waveform-audio
MCI_ESCAPEMCI_VD_ESCAPE_PARMS直接向设备发送一个串 仅用于激光视频
MCI_FREEZEMCI_GENERIC_PARMS将显示定格 Digital-video, video-overlay, and VCR devices
MCI_GETDEVCAPSMCI_GETDEVCAPS_PARMS获取设备信息,用于所有设备
MCI_INDEXMCI_GENERIC_PARMS当前屏幕显示与否, 仅用于VCR设备
MCI_INFOMCI_INFO_PARMS获取设备字符串信息
MCI_LISTMCI_GENERIC_PARMS获取输入设备数量,支持数字视频和VCR设备
MCI_LOADMCI_DGV_LOAD_PARMS装入一个文件 Digital-video and video-overlay
MCI_MARKMCI_GENERIC_PARMS取消或做一个记号,供MCI_SEEK快速定位 VCR devices
MCI_MONITORMCI_DGV_MONITOR_PARMS为数字视频指定报告设备
MCI_OPENMCI_OPEN_PARMS打开设备,用于所有设备
MCI_PASTEMCI_ DGV_ PASTE_ PARMS粘帖数据 仅用于数字视频
MCI_PAUSEMCI_GENERIC_PARMS暂停当前动作
MCI_PLAYMCI_PLAY_PARMS播放
MCI_PUTMCI_GENERIC_PARMS设置源、目的和边框矩形 Digital-video and video-overlay
MCI_QUALITYMCI_DGV_QUALITY_PARMS定义设备缺省质量
MCI_RECORDMCI_RECORD_PARMS开始录制 VCR and waveform-audio
MCI_RESERVEMCI_DGV_RESERVE_PARMS为后面的记录分配相对连续的硬盘空间 Digital-video
MCI_RESTOREMCI_DGV_RESTORE_PARMS拷贝一个bmp文件至帧缓冲 Digital-video
MCI_RESUMEMCI_GENERIC_PARMS使一个暂停设备重新启动 Digital-video, VCR, and waveform-audio
MCI_SAVEMCI_SAVE_PARMS保存数据 Video-overlay and waveform-audio
MCI_SEEKMCI_SEEK_PARMS更改媒体位置
MCI_SETMCI_SET_PARMS设置设备信息
MCI_SETAUDIOMCI_GENERIC_PARMS设置视频设备中的 audio 播放和捕捉的相关参数 用于Digital-video and VCR
MCI_SETTIMECODEMCI_GENERIC_PARMS启用或取消VCR设备的时间码 用于 VCR
MCI_SETTUNERMCI_VCR_SETTUNER_PARMS设置VCR设备频道
MCI_SETVIDEOMCI_GENERIC_PARMS设置video参数 用于Digital-video and VCR
MCI_SIGNALMCI_DGV_SIGNAL_PARMS在工作区上设置指定空间 用于Digital-video
MCI_STATUSMCI_STATUS_PARMS获取设备当前的相关状态信息,用于所有设备
MCI_STEPMCI_GENERIC_PARMS使播放设备跳帧 Digital-video, VCR, and CAV-format videodisc
MCI_STOPMCI_GENERIC_PARMS停止播放和录音 CD audio, digital-video, MIDI sequencer, videodisc, VCR, andwaveform-audio
MCI_SYSINFOMCI_SYSINFO_PARMS返回MCI设备信息
MCI_UNDOMCI_GENERIC_PARMS取消操作 如新近操作MCI_CUT, MCI_COPY, MCI_DELETE, or MCI_PASTE 等 用于Digital-video devices
MCI_UNFREEZEMCI_GENERIC_PARMS让使用MCI_UNFREEZE的视频缓冲区恢复运动 Digital-video, VCR, and video-overlay
MCI_UPDATEMCI_GENERIC_PARMS更新显示区域 Digital-video devices
MCI_WHEREMCI_GENERIC_PARMS获取设备裁减矩形 Digital-video, and video-overlay devices
MCI_WINDOWMCI_GENERIC_PARMS指定图形设备窗口和窗口特性 用于 Digital-video, and video-overlay devices

返回值

  • 0 — 执行成功
  • 错误代码(返回的DWORD值的低位字包含错误返回值。如果错误是特定于设备的,则返回值的高位字是驱动程序标识符;否则,高阶字为零。) — 执行错误

错误码获取

BOOL mciGetErrorString(
  DWORD fdwError,  	  // 函数mciSendString返回的错误码
  LPTSTR lpszErrorText,  // 接收描述错误的字符串的缓冲区
  UINT  cchErrorText   // 缓冲区的长度
);

easyx音乐播放器(转载)

这边介绍一个在easyx官网上看到的音乐播放器,附上网址:源代码链接

1、打开文件

bool MusicMCI::open(LPCWSTR strSongPath) noexcept
{
	MCI_OPEN_PARMS mciOP;
	mciOP.lpstrDeviceType = nullptr;
	mciOP.lpstrElementName = strSongPath;

	if (0 == mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_WAIT | MCI_OPEN_SHAREABLE, (DWORD_PTR)(static_cast<LPVOID>(&mciOP))))
	{
		nDeviceID = mciOP.wDeviceID;
		return true;
	}
	else
	{
		nDeviceID = -1;
		return false;
	}
}

2、播放

bool MusicMCI::play() noexcept
{
	MCI_PLAY_PARMS mciPP{};

	if (0 == mciSendCommand(nDeviceID, MCI_PLAY, MCI_NOTIFY, (DWORD_PTR)(static_cast<LPVOID>(&mciPP))))
	{
		return true;
	}
	else
	{
		return false;
	}
}

3、暂停

bool MusicMCI::pause() noexcept
{
	MCI_GENERIC_PARMS mciGP{};

	if (0 == mciSendCommand(nDeviceID, MCI_PAUSE, MCI_NOTIFY | MCI_WAIT, (DWORD_PTR)(static_cast<LPVOID>(&mciGP))))
	{
		return true;
	}
	else
	{
		return false;
	}
}

4、停止

bool MusicMCI::stop() noexcept
{
	MCI_SEEK_PARMS mciSP{};

	if (0 == mciSendCommand(nDeviceID, MCI_SEEK, MCI_WAIT | MCI_NOTIFY | MCI_SEEK_TO_START, (DWORD_PTR)(static_cast<LPVOID>(&mciSP))))
	{
		return true;
	}
	else
	{
		return false;
	}
}

5、关闭

bool MusicMCI::close() noexcept
{
	MCI_GENERIC_PARMS mciGP{};

	if (0 == mciSendCommand(nDeviceID, MCI_CLOSE, MCI_NOTIFY | MCI_WAIT, (DWORD_PTR)(static_cast<LPVOID>(&mciGP))))
	{
		nDeviceID = -1;
		return true;
	}
	else
	{
		return false;
	}
}

6、获取当前播放时间

bool MusicMCI::getCurrentTime(DWORD& pos) noexcept
{
	MCI_STATUS_PARMS mciSP{};
	mciSP.dwItem = MCI_STATUS_POSITION;

	if (0 == mciSendCommand(nDeviceID, MCI_STATUS, MCI_STATUS_ITEM, (DWORD_PTR)(static_cast<LPVOID>(&mciSP))))
	{
		pos = static_cast<DWORD>(mciSP.dwReturn);
		return true;
	}
	else
	{
		pos = 0;
		return false;
	}
}

7、获取音乐总时长

bool MusicMCI::getTotalTime(DWORD& time) noexcept
{
	MCI_STATUS_PARMS mciSP{};
	mciSP.dwItem = MCI_STATUS_LENGTH;

	if (0 == mciSendCommand(nDeviceID, MCI_STATUS, MCI_WAIT | MCI_STATUS_ITEM, (DWORD_PTR)(static_cast<LPVOID>(&mciSP))))
	{
		time = static_cast<DWORD>(mciSP.dwReturn);
		return true;
	}
	else
	{
		time = 0;
		return false;
	}
}

8、设置音量大小

bool MusicMCI::setVolume(size_t nVolumeValue) noexcept
{
	if (nVolumeValue > 1000)
	{
		nVolumeValue = 1000;
	}
	else if (nVolumeValue < 0)
	{
		nVolumeValue = 0;
	}

	MCI_DGV_SETAUDIO_PARMS mciDSP;
	mciDSP.dwItem = MCI_DGV_SETAUDIO_VOLUME;
	mciDSP.dwValue = static_cast<DWORD>(nVolumeValue);

	if (0 == mciSendCommand(nDeviceID, MCI_SETAUDIO, MCI_DGV_SETAUDIO_VALUE | MCI_DGV_SETAUDIO_ITEM, (DWORD_PTR)(static_cast<LPVOID>(&mciDSP))))
	{
		return true;
	}
	else
	{
		return false;
	}
}

9、设置播放位置

bool MusicMCI::setStartTime(size_t start_time) noexcept
{
	DWORD end_time = 0;
	this->getTotalTime(end_time);

	if (start_time > end_time)
	{
		return false;
	}

	MCI_PLAY_PARMS mciPlay{};
	mciPlay.dwFrom = static_cast<DWORD>(start_time);
	mciPlay.dwTo = static_cast<DWORD>(end_time);

	if (0 == mciSendCommand(nDeviceID, MCI_PLAY, MCI_TO | MCI_FROM, (DWORD_PTR)(static_cast<LPVOID>(&mciPlay))))
	{
		return true;
	}
	else
	{
		return false;
	}
}

踩过的坑

  1. 头文件顺序错误

    #include <mmsystem.h>
    #include <Windows.h>
    

    错误信息:

    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(94): error C2061: 语法错误: 标识符“MMVERSION”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(94): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(98): error C2061: 语法错误: 标识符“MMRESULT”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(98): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(102): error C2061: 语法错误: 标识符“FAR”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(102): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(109): error C2061: 语法错误: 标识符“UINT”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(112): error C2061: 语法错误: 标识符“DWORD”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(113): error C2061: 语法错误: 标识符“sample”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(113): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(114): error C2061: 语法错误: 标识符“cb”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(114): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(115): error C2061: 语法错误: 标识符“ticks”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(115): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(120): error C2061: 语法错误: 标识符“BYTE”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(121): error C2061: 语法错误: 标识符“min”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(121): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(122): error C2061: 语法错误: 标识符“sec”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(122): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(123): error C2061: 语法错误: 标识符“frame”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(123): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(124): error C2061: 语法错误: 标识符“fps”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(124): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(125): error C2061: 语法错误: 标识符“dummy”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(125): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(127): error C2061: 语法错误: 标识符“pad”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(127): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(127): error C2059: 语法错误:[1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(129): error C2059: 语法错误:}1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(134): error C2061: 语法错误: 标识符“DWORD”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(135): error C2059: 语法错误:}1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(136): error C2059: 语法错误:}1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(137): error C2059: 语法错误:}1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(297): error C2146: 语法错误: 缺少“)(在标识符“DRVCALLBACK”的前面)
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(297): error C2061: 语法错误: 标识符“DRVCALLBACK”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(297): error C2059: 语法错误:)1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(297): error C2146: 语法错误: 缺少“)(在标识符“hdrvr”的前面)
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(297): error C2061: 语法错误: 标识符“hdrvr”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(297): error C2059: 语法错误:,1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(299): error C2061: 语法错误: 标识符“FAR”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(299): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mmsyscom.h(301): error C2143: 语法错误: 缺少“{(在“*”的前面)
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(37): error C2061: 语法错误: 标识符“MCIERROR”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(37): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(42): error C2061: 语法错误: 标识符“MCIDEVICEID”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(42): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(45): error C2143: 语法错误: 缺少“)(在“*”的前面)
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(45): error C2143: 语法错误: 缺少“{(在“*”的前面)
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(45): error C2059: 语法错误:)1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(45): error C2146: 语法错误: 缺少“)(在标识符“mciId”的前面)
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(45): error C2061: 语法错误: 标识符“mciId”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(45): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(45): error C2059: 语法错误:,1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(51): error C2061: 语法错误: 标识符“MCIERROR”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(51): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(53): error C2061: 语法错误: 标识符“mciSendCommandA”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(53): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(54): error C2146: 语法错误: 缺少“)(在标识符“mciId”的前面)
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(54): error C2061: 语法错误: 标识符“mciId”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(54): error C2059: 语法错误:,1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(58): error C2059: 语法错误:)1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(61): error C2061: 语法错误: 标识符“MCIERROR”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(61): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(63): error C2061: 语法错误: 标识符“mciSendCommandW”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(63): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(64): error C2146: 语法错误: 缺少“)(在标识符“mciId”的前面)
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(64): error C2061: 语法错误: 标识符“mciId”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(64): error C2059: 语法错误:,1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(68): error C2059: 语法错误:)1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(76): error C2061: 语法错误: 标识符“MCIERROR”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(76): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(78): error C2061: 语法错误: 标识符“mciSendStringA”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(78): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(79): error C2146: 语法错误: 缺少“)(在标识符“lpstrCommand”的前面)
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(79): error C2061: 语法错误: 标识符“lpstrCommand”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(79): error C2059: 语法错误:,1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(83): error C2059: 语法错误:)1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(86): error C2061: 语法错误: 标识符“MCIERROR”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(86): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(88): error C2061: 语法错误: 标识符“mciSendStringW”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(88): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(89): error C2146: 语法错误: 缺少“)(在标识符“lpstrCommand”的前面)
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(89): error C2061: 语法错误: 标识符“lpstrCommand”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(89): error C2059: 语法错误:,1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(93): error C2059: 语法错误:)1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(101): error C2061: 语法错误: 标识符“MCIDEVICEID”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(101): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(103): error C2061: 语法错误: 标识符“mciGetDeviceIDA”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(103): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(104): error C2146: 语法错误: 缺少“)(在标识符“pszDevice”的前面)
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(104): error C2061: 语法错误: 标识符“pszDevice”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(105): error C2059: 语法错误:)1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(108): error C2061: 语法错误: 标识符“MCIDEVICEID”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(108): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(110): error C2061: 语法错误: 标识符“mciGetDeviceIDW”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(110): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(111): error C2146: 语法错误: 缺少“)(在标识符“pszDevice”的前面)
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(111): error C2061: 语法错误: 标识符“pszDevice”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(112): error C2059: 语法错误:)1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(120): error C2061: 语法错误: 标识符“MCIDEVICEID”
    1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(120): error C2059: 语法错误:;1>c:\program files (x86)\windows kits\10\include\10.0.17763.0\um\mciapi.h(120): fatal error C1003: 错误计数超过 100;正在停止编译
    
  2. 文件名中有空格
    比如说:音乐名字从AAA-恋音と雨空.mp3变成AAA- 恋音と雨空.mp3
    代码变成MymciSendString("open AAA- 恋音と雨空.mp3 alias BackMusic", NULL);
    不会报错,但是播放没有声音,应该是因为命令之间是用空格隔开的,所以不符合解析格式,所以没声音。

  3. 在其他编译器使用这两个函数(以DEV举例)
    编译mciSendString报错信息:
    在这里插入图片描述
    原因是#pragma comment(lib, “Winmm.lib”) 微软自家vc 编译器cl.exe专有 宏指令,别家的不认。
    解决方法:自己添加链接
    在这里插入图片描述
    在这里插入图片描述

百度云链接

链接:https://pan.baidu.com/s/1EzgYMHxCUnI4JFco1Tc_YA
提取码:06av

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐