无法编译旧的 WIN32 WINAPI 程序
Posted
技术标签:
【中文标题】无法编译旧的 WIN32 WINAPI 程序【英文标题】:Can't get an old WIN32 WINAPI program to compile 【发布时间】:2020-03-26 11:12:33 【问题描述】:我尝试了 CodeBlocks 和 MS VC++ 2010,但都无法编译。
他们在 . 有什么问题?
case WM_CREATE:
PlaySound (TEXT("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
return 0 ;
错误:
error C2065: 'SND_FILENAME': nichtdeklarierter Bezeichner
error C2065: 'SND_ASYNC': nichtdeklarierter Bezeichner
error C3861: "PlaySound": Bezeichner wurde nicht gefunden.
windows.h 包含在 stdafx.h 中 但即使我将它直接包含在代码块中,它也不起作用。
【问题讨论】:
将#undef WIN32_LEAN_AND_MEAN
放在#include 之前,然后重试。
【参考方案1】:
PlaySound
和 SND_…
的符号在 mmsystem.h
标头中声明并在 winmm.lib
库中定义。您必须包含并链接这些内容。
【讨论】:
mmsystem.h 应该包含在 windows.h 中 (docs.microsoft.com/en-us/previous-versions/…) 不应该将它们包含在 windows.h 中吗? docs.microsoft.com/en-us/previous-versions/dd743680(v%3Dvs.85) 如果定义了WIN32_LEAN_AND_MEAN
,windows.h
不包括mmsystem.h
(以及许多其他)【参考方案2】:
PlaySound
函数在Mmsystem.h
中声明(包含在Windows.h
中)。确保包括在内。查看更多关于该功能here。
请注意,如果定义了WIN32_LEAN_AND_MEAN
,则Windows.h
不包括Mmsystem.h
。如果您发现问题,请务必在#include <Windows.h>
之前#undef WIN32_LEAN_AND_MEAN
。
然后,如果您遇到链接器错误,请从该练习的书籍(Programming Windows 5th ed Chapter 2)中多阅读一些内容:
几个警告:如果您使用 Microsoft Visual C++ 创建一个新的 此程序的项目,您需要对对象进行添加 链接器使用的库。从项目中选择设置选项 菜单,然后选择链接选项卡。从类别列表中选择常规 框,并将 WINMM.LIB(“Windows 多媒体”)添加到对象/库 模块文本框。您需要这样做,因为 HELLOWIN 使用 多媒体函数调用,多媒体对象库不在 包含在默认项目中。否则你会收到一条错误信息 来自链接器表明 PlaySound 函数未解析。
【讨论】:
问题是询问编译器错误。这个答案试图解决链接器错误。不适用,抱歉。不知道为什么这得到了 3 票。 编辑没有帮助。 OP 没有收到符号 WM_CREATE 的编译器错误(通过包含“Windows.h”引入)。这个答案没有解决问题。 您提供的链接提到WM_CREATE
可以由Winuser.h
引入而无需Windows.h
。
评论将是验证这一点的正确工具。 This comment 可能更接近问题(应该是答案)。【参考方案3】:
尝试包含 MMSystem.h
和 Windows.h
,因为默认情况下,MMSystem.h
应该包含在 Windows.h,
中,但是当定义 WIN32_LEAN_AND_MEAN
时,Windows.h
将不包含它。
您还应该将winmm.lib
添加到链接器(通过输入-lwinmm
),因为PlaySound
、SND_SYNC
、SND_ASYNC
和SND_FILENAME
的符号在那里定义。
【讨论】:
包括“windows.h”和“mmsystem.h”并在链接器的附加参数中输入“-lwinmm”或“winmm.lib”。以上是关于无法编译旧的 WIN32 WINAPI 程序的主要内容,如果未能解决你的问题,请参考以下文章
PASCAL==CALLBACK==WINAPI==__stdcall
在 32 位 win7 上部署 Qt 应用程序 - 在 Win7 x64 上工作(和编译)
CompileAssemblyFromSource 返回错误“编译表达式:无法打开 c:\Users\*”以读取 'c:\Users\* 不是有效的 Win32 资源文件