我试图在后台播放.wav文件,但我收到两个错误:
“const char *”类型的参数与“LPCWSTR”类型的参数不兼容
和另一个错误,指出:
'BOOL PlaySoundW(LPCWSTR,HMODULE,DWORD)':无法将参数1从'const char [16]'转换为'LPCWSTR'
我可以使用 PlaySound(TEXT("Totalrecall.wav"), NULL, SND_FILENAME|SND_LOOP);
播放声音,但是当我尝试在后台播放并使用 PlaySound("Totalrecall.wav", NULL, SND_FILENAME|SND_LOOP|SND_ASYNC);
循环播放时出现错误
1 回答
PlaySound()
没有A
或W
后缀映射到PlaySoundW()
或PlaySoundA()
,具体取决于是否分别定义了UNICODE
.PlaySound()
的此变体将LPCTSTR
(const TCHAR*
)作为输入 .TCHAR
映射到wchar_t
或char
,具体取决于是否分别定义了UNICODE
.TEXT()
将编译时字符串/ char文字映射到const wchar_t[]
/wchar_t
或const char[]
/char
,具体取决于是否分别定义了UNICODE
.由于错误消息抱怨
PlaySoundW
和LPCWSTR
,您显然正在编译启用了Unicode的项目,其中定义了UNICODE
条件 .但是你试图传递一个狭窄的
const char[]
字符串文字,其中需要一个宽的wchar_t*
字符串,因此你会遇到编译器错误 .调用
PlaySound(TEXT("Totalrecall.wav"), ...)
将始终正常编译 - 定义UNICODE
时将调用PlaySoundW(L"Totalrecall.wav", ...)
,未定义时调用PlaySoundA("Totalrecall.wav", ...)
.但是只有在未定义
UNICODE
时才调用PlaySound("Totalrecall.wav", ...)
.话虽这么说,如果你想无条件地传递一个窄字符串,特别是如果它是一个运行时变量,直接使用
PlaySoundA()
:如果要无条件地传递宽字符串,特别是如果它是运行时变量,请直接使用
PlaySoundW()
:否则,通常使用
TEXT()
和PlaySound()
(但仅用于编译时字符串文字):处理字符串数据的大多数Win32 API函数和结构以这种方式运行,提供单独的
A
和W
变体,并使用预处理器宏将基于TCHAR
的代码映射到其中一个 . 过去几年中只引入了较新的API,严格来说只支持Unicode,不提供ANSI变体 .