无法编译旧的 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】:

PlaySoundSND_… 的符号在 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_MEANwindows.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.hWindows.h,因为默认情况下,MMSystem.h 应该包含在 Windows.h, 中,但是当定义 WIN32_LEAN_AND_MEAN 时,Windows.h 将不包含它。 您还应该将winmm.lib 添加到链接器(通过输入-lwinmm),因为PlaySoundSND_SYNCSND_ASYNCSND_FILENAME 的符号在那里定义。

【讨论】:

包括“windows.h”和“mmsystem.h”并在链接器的附加参数中输入“-lwinmm”或“winmm.lib”。

以上是关于无法编译旧的 WIN32 WINAPI 程序的主要内容,如果未能解决你的问题,请参考以下文章

PASCAL==CALLBACK==WINAPI==__stdcall

Win API - 无法向窗口添加弹出菜单和图标

在 32 位 win7 上部署 Qt 应用程序 - 在 Win7 x64 上工作(和编译)

CompileAssemblyFromSource 返回错误“编译表达式:无法打开 c:\Users\*”以读取 'c:\Users\* 不是有效的 Win32 资源文件

[编译] 2minGW gcc在windows搭建编译win32程序环境

win7下学习汇编语言,用啥编译器比较合适??