首页 文章

无法将const char [16]转换为LPCWSTR [关闭]

提问于
浏览
-3

我试图在后台播放.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 回答

  • 3

    PlaySound() 没有 AW 后缀映射到 PlaySoundW()PlaySoundA() ,具体取决于是否分别定义了 UNICODE . PlaySound() 的此变体将 LPCTSTRconst TCHAR* )作为输入 .

    TCHAR 映射到 wchar_tchar ,具体取决于是否分别定义了 UNICODE .

    TEXT() 将编译时字符串/ char文字映射到 const wchar_t[] / wchar_tconst char[] / char ,具体取决于是否分别定义了 UNICODE .

    由于错误消息抱怨 PlaySoundWLPCWSTR ,您显然正在编译启用了Unicode的项目,其中定义了 UNICODE 条件 .

    但是你试图传递一个狭窄的 const char[] 字符串文字,其中需要一个宽的 wchar_t* 字符串,因此你会遇到编译器错误 .

    调用 PlaySound(TEXT("Totalrecall.wav"), ...) 将始终正常编译 - 定义 UNICODE 时将调用 PlaySoundW(L"Totalrecall.wav", ...) ,未定义时调用 PlaySoundA("Totalrecall.wav", ...) .

    但是只有在未定义 UNICODE 时才调用 PlaySound("Totalrecall.wav", ...) .

    话虽这么说,如果你想无条件地传递一个窄字符串,特别是如果它是一个运行时变量,直接使用 PlaySoundA()

    PlaySoundA("Totalrecall.wav", ...)
    

    如果要无条件地传递宽字符串,特别是如果它是运行时变量,请直接使用 PlaySoundW()

    PlaySoundW(L"Totalrecall.wav", ...)
    

    否则,通常使用 TEXT()PlaySound() (但仅用于编译时字符串文字):

    PlaySound(TEXT("Totalrecall.wav"), ...)
    

    处理字符串数据的大多数Win32 API函数和结构以这种方式运行,提供单独的 AW 变体,并使用预处理器宏将基于 TCHAR 的代码映射到其中一个 . 过去几年中只引入了较新的API,严格来说只支持Unicode,不提供ANSI变体 .

相关问题