C++ 中stdafx.h 错误是什么意思

PlaySound_百度百科
特色百科用户权威合作手机百科
收藏 查看&PlaySound本词条缺少概述、信息栏、名片图,补充相关内容使词条更完整,还能快速升级,赶紧来吧!
PlaySound函数的声明为:
BOOL PlaySound(LPCSTR pszSound, HMODULE hwnd,DWORD fdwSound);
参数pszSound是指定了要播放声音的字符串,该参数可以是WAVE文件的名字,或是WAV资源的名字,或是内存中声音数据的,或是在WIN.INI中定义的系统事件声音。如果该参数为NULL则停止正在播放的声音。
参数hwnd是的实例句柄,除非pszSound的指向一个资源(即fdwSound被定义为SND_RESOURCE),否则必须设置为。
参数fdwSound是标志的组合,如下表所示。若成功则函数返回TRUE,否则返回FALSE。
使用PlaySound函数时需要在#include&windows.h&后面加上(注意:不能加在前面):
#include &mmsystem.h&
#pragma comment(lib, &WINMM.LIB&)
SND_APPLICATION
用指定的关联来播放声音。
pszSound参数指定了注册表或WIN.INI中的系统事件的别名。
SND_ALIAS_ID
pszSound参数指定了预定义的声音。
用异步方式播放声音,PlaySound函数在开始播放后立即返回。
SND_FILENAME
pszSound参数指定了WAVE文件名。
重复播放声音,必须与SND_ASYNC标志一块使用。
SND_MEMORY
播放载入到内存中的声音,此时pszSound是指向声音数据的指针。
SND_NODEFAULT
不播放缺省声音,若无此标志,则PlaySound在没找到声音时会播放缺省声音。
SND_NOSTOP
PlaySound不打断原来的声音播出并立即返回FALSE。
SND_NOWAIT
如果正忙则函数就不播放声音并立即返回。
停止所有与调用任务有关的声音。若参数pszSound为NULL,就停止所有的声音,否则,停止pszSound指定的声音。
SND_RESOURCE
pszSound参数是WAVE资源的,这时要用到hmod参数。
同步播放声音,在播放完后PlaySound函数才返回。
SND_SYSTEM
如果是背景窗口,
如果这个标志被设置,声音是分配到音频会议系统通知的声音。系统音量控制程序(sndvol)显示音量滑块控制系统通知的声音。设置该标志将下控制音量滑块。如果没有设置该标志,声音是分配到默认的音频会议的应用进程。更多信息,请参阅文档的核心音频API的软件开发工具包在C:\WINDOWS\MEDIA目录下有一个名为The Microsoft Sound.wav的声音文件,在Windows 95启动时会播放这个声音。下面我们用三种方法来调用PlaySound函数播出Windows 95的启动声音。
第一种方法是直接播出声音文件,相应的代码为:
PlaySound(&c:\\WINDOWS\\MEDIA\\The Microsoft Sound.wav&, NULL, SND_FILENAME | SND_ASYNC);
注意参数中的使用两个连续的转义代表一个反斜杠。
第二种方法是把声音文件加入到资源中,然后从资源中播放声音。支持WAVE型资源,用户在资源视图中单击鼠标右键并选择Import命令,然后在文件选择对话框中选择The Microsoft Sound.wav文件,则该文件就会被加入到WAVE资源中。假定声音资源的ID为IDR_STARTWIN,则下面的调用同样会输出启动声音:
PlaySound((LPCTSTR)IDR_STARTWIN, AfxGetInstanceHandle(), SND_RESOURCE | SND_ASYNC);
////////上面的(LPCTSTR)可能需改成(LPCWSTR)
第三种方法是用PlaySound播放系统声音,Windows启动的声音是由SystemStart定义的系统声音,因此可以用下面的方法播放启动声音:
PlaySound(&SystemStart&,NULL,SND_ALIAS|SND_ASYNC);
函数sndPlaySound的功能与PlaySound类似,但少了一个参数。函数的声明为:
BOOL sndPlaySound(LPCSTR lpszSound, UINT fuSound);
除了不能指定资源名字外,参数lpszSound与PlaySound的是一样的。参数fuSound是如何播放声音的标志,可以是SND_ASYNC、SND_LOOP、SND_MEMORY、SND_NODEFAULT、SND_NOSTOP和SND_SYNC的组合,这些标志的含义与PlaySound的一样。
可以看出,sndPlaySound不能直接播放声音资源。要用该函数播放WAVE文件,可按下面的方式调用:
sndPlaySound(“MYSOUND.WAV”,SND_ASYNC);#include &stdAfx.h&
#include &windows.h&
#include &mmsystem.h& // 加上,不然PlaySound函数无法使用
#pragma comment(lib, &WINMM.LIB&) // 加上,不然PlaySound函数无法使用
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR szCmdLine,int iCmdShow)
static TCHAR szAppName[] = TEXT (&HelloWin&) ;
wndclass.style= CS_HREDRAW | CS_VREDRAW ;
wndclass.lpfnWndProc = WndP
wndclass.cbClsExtra = 0 ;
wndclass.cbWndExtra = 0 ;
wndclass.hInstance = hI
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ;
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;
wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
wndclass.lpszMenuName = NULL ;
wndclass.lpszClassName= szAppN
if (!RegisterClass (&wndclass))
MessageBox ( NULL, TEXT (&This program requires Windows NT!&),szAppName, MB_ICONERROR) ;
return 0 ;
hwnd = CreateWindow( szAppName, // window class name
TEXT (&The Hello Program&), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT,// initial x position
CW_USEDEFAULT,// initial y position
CW_USEDEFAULT,// initial x size
CW_USEDEFAULT,// initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, iCmdShow) ;
UpdateWindow (hwnd) ;
while (GetMessage (&msg, NULL, 0, 0))
TranslateMessage (&msg) ;
DispatchMessage (&msg) ;
return msg.wP
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
PAINTSTRUCT
switch (message)
case WM_CREATE:
PlaySound(TEXT(&TESTWAVE.wav&), NULL, SND_FILENAME | SND_ASYNC) ;
return 0 ;
case WM_PAINT:
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
DrawText (hdc, TEXT (&Hello, Windows 98!&), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ;
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
return DefWindowProc (hwnd, message, wParam, lParam) ;
using System.Runtime.InteropS
using System.T
namespace MkSipSDK.Sound
public class WavPlayer
protected const int SND_SYNC = 0x0;
protected const int SND_ASYNC = 0x1;
protected const int SND_NODEFAULT = 0x2;
protected const int SND_MEMORY = 0x4;
protected const int SND_LOOP = 0x8;
protected const int SND_NOSTOP = 0x10;
protected const int SND_NOWAIT = 0x2000;
protected const int SND_ALIAS = 0x10000;
protected const int SND_ALIAS_ID = 0x110000;
protected const int SND_FILENAME = 0x20000;
protected const int SND_RESOURCE = 0x40004;
protected const int SND_PURGE = 0x40;
protected const int SND_APPLICATION = 0x80;
[DllImport(&winmm&)]
public static extern bool PlaySound(string szSound, IntPtr hMod, int flags);
/// &summary&
/// 播发wav文件方法
/// &/summary&
/// &param name=&wavFile&&wav文件路径&/param&
/// &param name=&repeatCount&&重复次数&/param&
private static void Play(string wavFile)
PlaySound(wavFile, IntPtr.Zero, SND_FILENAME | SND_SYNC); //同步,阻塞线程
//PlaySound(wavFile, IntPtr.Zero, SND_FILENAME | SND_ASYNC); //异步,非阻塞线程
//PlaySound(wavFile, IntPtr.Zero, 1 | 0x | repeatCount);
/// &summary&
/// 响铃播放
/// &/summary&
/// &param name=&wavFile&&wav文件路径&/param&
/// &param name=&repeatCount&&重复次数&/param&
public static void Ring(string wavFile, int repeatCount = 3)
ThreadPool.QueueUserWorkItem(delegate(object obj) {
for (int i = 0; i & repeatC i++) {
Play(wavFile);
新手上路我有疑问投诉建议参考资料 查看C++预编译头文件stdafx.h作用
&&& 许多初学 VC
的朋友也许都为那么一个问题困扰过:
&&& 为什么所有的
cpp 都必须 #include "stdafx.h"
也许请教了别的高手之后,他们会告诉你,这是预编译头,必须包含。可是,这到底
是为什么呢?预编译头有什么用呢?
这得从头文件的编译原理讲起。其实头文件并不神秘,它的全部作用,就是把自己的
所有内容直接“粘贴”到相应的 #include 语句处。如果不相信的话,不妨做个实验,将
一个 cpp 中的所有 #include 语句删掉,并将它包含的文件粘贴到相应的位置,你会发
现,文件的编译和运行都完全没有受到影响。其实,编译器在编译你的程序的时候,所做
的第一件事,也就是展开所有的 #include 语句和 #define 语句。
头文件的出现,固然给书写程序带来了很大方便。可是到了 Windows 时代后,慢慢
就呈现出一些问题了。几乎所有的 Windows 程序都必须包含 windows.h,而那个文件却
硕大无比,将它展开后往所有文件中一粘贴,编译的时候立刻慢得像只蜗牛。
&&& 到了 MFC
时代后,情况更为恶劣了。毕竟 C 风格的 Windows 头文件里面包含的还
仅仅是函数定义和宏,编译难度不算太大,而 MFC 库里面的头文件可都是类声明啊!更
何况,一个最简单的工程,都会生成大量的类,需要用到大量的函数。如果工程稍微复杂
一些,编译难度可想而知!
但是,人们惊奇地发现,虽然用到的头文件又多又杂,但是在一个工程中,总有那么
一堆头文件,是几乎所有 cpp 都必须包含的。那么,可不可以把这些头文件提取出来,
只编译一编,然后所有其它 cpp 就都能使用呢?没错,这就是预编译头的思想都由来!
实践证明,使用了预编译头技术后,编译速度大大提高了。可以到你的工程目录下的
Debug 或 Release 目录中看一看,里面有一个体积极为硕大的 .pch 文件,那就是传说
中的“编译之后的预编译头”。
使用了预编译头技术后,虽然带来了极大地方便,但也造成了一个问题:由于它假定
预编译头中包含过的头文件会在所有 cpp 中使用,因此它在编译你的 cpp 的时候,就会
将预编译头中已经编译完的部分加载到内存中。如果它突然发现你的 cpp 居然没有包含
预编译头,它就会很郁闷,因为它不知道该如何将已编译完的部分从内存中请出去,整个
编译过程就会失败。
因此,如果你使用了预编译头技术,就必须在所有的 cpp 中包含预编译头。MFC 工
程中为你建立了一个默认的预编译头 stdafx.h,如果你愿意,也可以在自己的工程中使
用其它文件名作为你的预编译头,如果你觉得有必要。
预编译头文件的使用&
关键字:预编译,/Yu,/Yc,/Yx
本文介绍VC6的预编译功能的使用,由于预编译详细使用比较的复杂,这里只介绍几个最重要的预编译指令: /Yu,
/Yc,/Yx,/Fp。其它的详细资料可以参考:
MSDN-&Visual Studio D6.0Document -&
Visual C++6.0 Document
-&VC++ Programmer Guider -&Compiler
and Linker
-&Details-&Creating Precompiled
Header files
预编译头的概念:
所谓的预编译头就是把一个工程中的那一部分代码,预先编译好放在一个文件里(通常是以.pch为扩展名的),这个文件就称为预编译头文件这些预先编译好的代码可以是任何的C/C++代码--------甚至是inline的函数,但是必须是稳定的,在工程开发的过程中不会被经常改变。如果这些代码被修改,则需要重新编译生成预编译头文件。注意生成预编译头文件是很耗时间的。同时你得注意预编译头文件通常很大,通常有6-7M大。注意及时清理那些没有用的预编译头文件。
也许你会问:现在的编译器都有Time
stamp的功能,编译器在编译整个工程的时候,它只会编译那些经过修改的文件,而不会去编译那些从上次编译过,到现在没有被修改过的文件。那么为什么还要预编译头文件呢?答案在这里,我们知道编译器是以文件为单位编译的,一个文件经过修改后,会重新编译整个文件,当然在这个文件里包含的所有头文件中的东西(.eg
Macro, Preprocessor
)都要重新处理一遍。VC的预编译头文件保存的正是这部分信息。以避免每次都要重新处理这些头文件。
预编译头的作用:
方法一:手动方法
根据上文介绍,预编译头文件的作用当然就是提高便宜速度了,有了它你没有必要每次都编译那些不需要经常改变的代码。编译性能当然就提高了。
预编译头的使用:
要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch文件)
&想必大家都知道
StdAfx.h这个文件。很多人都认为这是VC提供的一个“系统级别”的,编译器带的一个头文件。其实不是的,这个文件可以是任何名字的。我们来考察一个典型的由AppWizard生成的MFC
Based 程序的预编译头文件。(因为AppWizard会为我们指定好如何使用预编译头文件,默认的是StdAfx.h,这是VC起的名字)。我们会发现这个头文件里包含了以下的头文件:
&afxwin.h&&&&&&&&&
// MFC core and standard components
&afxext.h&&&&&&&&&
// MFC extensions
&afxdisp.h&&&&&&&&
// MFC Automation classes
&afxdtctl.h&&&&&&&&&&&&&
// MFC support for Internet Explorer 4 Common Controls
&afxcmn.h&&&&&
这些正是使用MFC的必须包含的头文件,当然我们不太可能在我们的工程中修改这些头文件的,所以说他们是稳定的。
那么我们如何指定它来生成预编译头文件。我们知道一个头文件是不能编译的。所以我们还需要一个cpp文件来生成.pch
文件。这个文件默认的就是StdAfx.cpp。在这个文件里只有一句代码就是:#include
“Stdafx.h”。原因是理所当然的,我们仅仅是要它能够编译而已―――也就是说,要的只是它的.cpp的扩展名。我们可以用/Yc编译开关来指定StdAfx.cpp来生成一个.pch文件,通过/Fp编译开关来指定生成的pch文件的名字。打开project
-&Setting-&C/C++
对话框。把Category指向Precompiled Header。在左边的树形视图里选择整个工程 (如图)
在图中我们的Project Options(右下角的那个白的地方)可以看到 /Fp
“debug/PCH.pch”,这就是指定生成的.pch文件的名字,默认的通常是 &工程名&.pch(我的示例工程名就是PCH)。
然后,在左边的树形视图里选择StdAfx.cpp.如图:(图2)
这时原来的Project Option变成了 Source File
Option(原来是工程,现在是一个文件,当然变了)。在这里我们可以看到
/Yc开关,/Yc的作用就是指定这个文件来创建一个Pch文件。/Yc后面的文件名是那个包含了稳定代码的头文件,一个工程里只能有一个文件的可以有YC开关。VC就根据这个选项把
StdAfx.cpp编译成一个Obj文件和一个PCH文件。
&& 然后我们再选择一个其它的文件来看看,如图:
在这里,Precomplier 选择了 Use ………一项,头文件是我们指定创建PCH 文件的stdafx.h
文件。事实上,这里是使用工程里的设置,(如图1)/Yu”stdafx.h”。
这样,我们就设置好了预编译头文件。也就是说,我们可以使用预编译头功能了。以下是注意事项:
1):如果使用了/Yu,就是说使用了预编译,我们在每个.cpp文件的最开头,我强调一遍是最开头,包含
你指定产生pch文件的.h文件(默认是stdafx.h)不然就会有问题。如果你没有包含这个文件,就告诉你Unexpected file
end. 如果你不是在最开头包含的,你自己试以下就知道了,绝对有很惊人的效果…..
2)如果你把pch文件不小心丢了,根据以上的分析,你只要让编译器生成一个pch文件就可以了。也就是说把
stdafx.cpp(即指定/Yc的那个cpp文件)从新编译一遍就可以了。当然你可以傻傻的 Rebuild
all。简单一点就是选择那个cpp文件,按一下Ctrl + F7就可以了。
方法二。自动使用
很简单只要指定/YX就可以了。或者在上图中选择Automatic………就可以了。注意的事情是如果你指定了/Yc
/Yu的话,/Yx是会被忽略的。前者的优先级别高一些。
本文来自CSDN博客,转载请标明出处:
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。c++里stdafx是什么的缩写?
c++里stdafx是什么的缩写?
Standard Application Fram Extend
没有函数库,只是定义了一些环境参数,使得编译出来的程序能在32位的操作系统环境下运行。
Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要花费相当长的时间来完成工作。由于每个.CPP文件都包含相同的include文件,为每个.CPP文件都重复处理这些文件就显得很傻了。
为避免这种浪费,AppWizard和VisualC++编译程序一起进行工作,如下所示:
◎AppWizard建立了文件stdafx.h,该文件包含了所有当前工程文件需要的MFCinclude文件。且这一文件可以随被选择的选项而变化。
◎AppWizard然后就建立stdafx.cpp。这个文件通常都是一样的。
◎然后AppWizard就建立起工程文件,这样第一个被编译的文件就是stdafx.cpp。
◎当VisualC++编译stdafx.cpp文件时,它将结果保存在一个名为stdafx.pch的文件里。(扩展名pch表示预编译头文件。)
◎当VisualC++编译随后的每个.cpp文件时,它阅读并使用它刚生成的.pch文件。VisualC++不再分析Windowsinclude文件,除非你又编缉了stdafx.cpp或stdafx.h。
这个技术很精巧,你不这么认为吗?(还要说一句,Microsoft并非是首先采用这种技术的公司,Borland才是。)在这个过程中你必须遵守以下规则:
◎你编写的任何.cpp文件都必须首先包含stdafx.h。
◎如果你有工程文件里的大多数.cpp文件需要.h文件,顺便将它们加在stdafx.h(后部)上,然后预编译stdafx.cpp。
◎由于.pch文件具有大量的符号信息,它是你的工程文件里最大的文件。
如果你的磁盘空间有限,你就希望能将这个你从没使用过的工程文件中的.pch文件删除。执行程序时并不需要它们,且随着工程文件的重新建立,它们也自动地重新建立。
相关知识等待您来回答
编程领域专家C++中头文件(.h)和源文件(.cpp)都应该写些什么zz -
- ITeye技术网站
博客分类:
头文件(.h):
写类的声明(包括类里面的成员和方法的声明)、函数原型、#define常数等,但一般来说不写出具体的实现。
在写头文件时需要注意,在开头和结尾处必须按照如下样式加上预编译语句(如下):
#ifndef CIRCLE_H#define CIRCLE_H
//你的代码写在这里
这样做是为了防止重复编译,不这样做就有可能出错。
至于CIRCLE_H这个名字实际上是无所谓的,你叫什么都行,只要符合规范都行。原则上来说,非常建议把它写成这种形式,因为比较容易和头文件的名字对应。
源文件(.cpp):
源文件主要写实现头文件中已经声明的那些函数的具体代码。需要注意的是,开头必须#include一下实现的头文件,以及要用到的头文件。那么当你需要用到自己写的头文件中的类时,只需要#include进来就行了。
下面举个最简单的例子来描述一下,咱就求个圆面积。
第1步,建立一个空工程(以在VS2003环境下为例)。
第2步,在头文件的文件夹里新建一个名为Circle.h的头文件,它的内容如下:
#ifndef CIRCLE_H#define CIRCLE_H
class Circle...{private://半径public:
Circle();//构造函数
Circle(double R);//构造函数
double Area();//求面积函数};
注意到开头结尾的预编译语句。在头文件里,并不写出函数的具体实现。
第3步,要给出Circle类的具体实现,因此,在源文件夹里新建一个Circle.cpp的文件,它的内容如下:
#include "Circle.h"
Circle::Circle()...{
this-&r=5.0;}
Circle::Circle(double R)...{
this-&r=R;}
double Circle:: Area()...{
return 3.14*r*r;}
需要注意的是:开头处包含了Circle.h,事实上,只要此cpp文件用到的文件,都要包含进来!这个文件的名字其实不一定要叫Circle.cpp,但非常建议cpp文件与头文件相对应。
最后,我们建一个main.cpp来测试我们写的Circle类,它的内容如下:
#include &iostream&#include "Circle.h"
int main()...{
Circle c(3);
cout&&"Area="&&c.Area()&&
return 1;}
注意到开头时有#include "Circle.h"的声明,证明我们使用到了我们刚才写的Circle类。
至此,我们工程的结构为:
运行一下,输出结果为:
说明我们写的Circle类确实可以用了。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lyanliu/archive//2195632.aspx
beckshanling
浏览: 130266 次
来自: 宁波
但是我的Java Source File中显示的是*.clas ...
谢谢。。收益了
满足范式要求的数据库设计是结构清晰的,同时可避免数据冗余和操作 ...
这篇文章写的不错.但是排版不怎么好.刚学C++的菜鸟问问题!using namespace std是什么?
[问题点数:20分,结帖人jjjabc]
刚学C++的菜鸟问问题!using namespace std是什么?
[问题点数:20分,结帖人jjjabc]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 stdafx.h 错误 的文章

 

随机推荐