user-0 提问: C语言实现：集成音乐到EXE里边问题？

回复:
user: user-1
content: 引用 18 楼 my_xxh 的回复:[quote=引用 4 楼 Saleayas 的回复:] MAKEINTRESOURCE 谢谢大家积极的分享知识！问题解决了；代码修改为： #include"resource.h" #pragma  comment(lib,"winmm.lib") void MyplayMusic(void) { PlaySoundA(MAKEINTRESOURCE(WaveID),GetModuleHandle(NULL), SND_ASYNC|SND_RESOURCE);  } 自己第一次用VC6.0写这样的程序，犯了个错误，忘了把.rc文件导入到工程中，导致编译通过，能运行，就是播放不了音乐； 再次感谢大家了哈！[/quote] 恭喜解决问题。 我也学到了东西。

user: user-2
content: MAKEINTRESOURCE

user: user-3
content: 使用临时文件不会死人的。 GetTempFileName The GetTempFileName function creates a name for a temporary file. The filename is the concatenation of specified path and prefix strings, a hexadecimal string formed from a specified integer, and the .TMP extension.  The specified integer can be nonzero, in which case, the function creates the filename but does not create the file. If you specify zero for the integer, the function creates a unique filename and creates the file in the specified directory.  UINT GetTempFileName(   LPCTSTR lpPathName,  // pointer to directory name for temporary                         // file   LPCTSTR lpPrefixString,  // pointer to filename prefix   UINT uUnique,        // number used to create temporary filename   LPTSTR lpTempFileName                         // pointer to buffer that receives the new                         // filename );   Parameters lpPathName  Pointer to a null-terminated string that specifies the directory path for the filename. This string must consist of characters in the ANSI character set. Applications typically specify a period (.) or the result of the GetTempPath function for this parameter. If this parameter is NULL, the function fails.  lpPrefixString  Pointer to a null-terminated prefix string. The function uses the first three characters of this string as the prefix of the filename. This string must consist of characters in the ANSI character set.  uUnique  Specifies an unsigned integer that the function converts to a hexadecimal string for use in creating the temporary filename.  If uUnique is nonzero, the function appends the hexadecimal string to lpPrefixString to form the temporary filename. In this case, the function does not create the specified file, and does not test whether the filename is unique.   If uUnique is zero, the function uses a hexadecimal string derived from the current system time. In this case, the function uses different values until it finds a unique filename, and then it creates the file in the lpPathName directory.   lpTempFileName  Pointer to the buffer that receives the temporary filename. This null-terminated string consists of characters in the ANSI character set. This buffer should be at least the length, in bytes, specified by MAX_PATH to accommodate the path.  Return Values If the function succeeds, the return value specifies the unique numeric value used in the temporary filename. If the uUnique parameter is nonzero, the return value specifies that same number.   If the function fails, the return value is zero. To get extended error information, call GetLastError.   Remarks The GetTempFileName function creates a temporary filename of the following form:  path\preuuuu.TMP  The following table describes the filename syntax:   Component Meaning  path Path specified by the lpPathName parameter  pre First three letters of the lpPrefixString string  uuuu Hexadecimal value of uUnique    When the system shuts down, temporary files whose names have been created by this function are not automatically deleted.   To avoid problems resulting when converting an ANSI string, an application should call the CreateFile function to create a temporary file.   If the uUnique parameter is zero, GetTempFileName attempts to form a unique number based on the current system time. If a file with the resulting filename exists, the number is increased by one and the test for existence is repeated. Testing continues until a unique filename is found. GetTempFileName then creates a file by that name and closes it. When uUnique is nonzero, no attempt is made to create and open the file.   QuickInfo   Windows NT: Requires version 3.1 or later.   Windows: Requires Windows 95 or later.   Windows CE: Unsupported.   Header: Declared in winbase.h.   Import Library: Use kernel32.lib.   Unicode: Implemented as Unicode and ANSI versions on Windows NT.  See Also File I/O Overview, File Functions, CreateFile, GetTempPath

user: user-1
content: 引用 楼主 my_xxh 的回复:程序思路描述：把turn.wav音乐文件插入到VC6.0某个工程的资源文件中，获取音乐文件的ID号：IDR_WAVE1；利用      PlaySoundA播放这个音乐文件；          程序的目的：把音乐文件集成到exe文件中来。不用把turn.wav音乐文件放到指定目录下，那样很麻烦！程序怎么改能做到？  主要代码如下： ps:GetModuleHandle(NULL) 是为了获取资源所在模块的句柄；  #include"resource.h" #pragma  comment(lib,"winmm.lib") void MyplayMusic(void) { 	PlaySoundA(IDR_WAVE1,GetModuleHandle(NULL),SND_ASYNC|SND_RESOURCE); }  vc++6.0编译报错： error C2664: 'PlaySoundA' : cannot convert parameter 1 from 'const int' to 'const char *' 但是，vc2008里却能编译通过呢？   求解惑！谢谢大家！ playsound的参数要求是文件名（路径），你提供一个ID肯定是不行。可以把这个ID的资源存储成文件。然后再播放。

user: user-0
content: 引用 4 楼 Saleayas 的回复:MAKEINTRESOURCE 谢谢大家积极的分享知识！问题解决了；代码修改为： #include"resource.h" #pragma  comment(lib,"winmm.lib") void MyplayMusic(void) { PlaySoundA(MAKEINTRESOURCE(WaveID),GetModuleHandle(NULL), SND_ASYNC|SND_RESOURCE);  } 自己第一次用VC6.0写这样的程序，犯了个错误，忘了把.rc文件导入到工程中，导致编译通过，能运行，就是播放不了音乐； 再次感谢大家了哈！

user: user-4
content: 资源文件中，IDR_WAVE1后面接着的资源类型是不是WAVE啊...

user: user-0
content: http://msdn.microsoft.com/en-us/library/windows/desktop/dd743680(v=vs.85).aspx 13楼的用法是对的，我就是觉得我的第二个参数是不是出错了？我是这样用的 PlaySound(MAKEINTRESOURCE(IDR_WAVE1),GetModuleHandle(NULL), SND_ASYNC|SND_RESOURCE);

user: user-1
content: 引用 14 楼 my_xxh 的回复:[quote=引用 11 楼 zjq9931 的回复:] [quote=引用 10 楼 my_xxh 的回复:] [quote=引用 5 楼 u013491662 的回复:] 我以前是这么用的  PlaySound((LPCWSTR)IDR_WAVE1,NULL,SND_ASYNC|SND_RESOURCE);  PlaySound函数的第二个参数为NULL，不需要获取包含资源的模块句柄嘛？我试了哈PlaySound((LPCWSTR)IDR_WAVE1,NULL,SND_ASYNC|SND_RESOURCE); 也是能通过编译，运行的起来，就是不能正常播放声音！MSDN上的描述如下图：可我这样写的：PlaySound(MAKEINTRESOURCE(IDR_WAVE1),GetModuleHandle(NULL), SND_ASYNC|SND_RESOURCE);   能运行，就是不能正常执行播放音乐，返回true; 错在？ [/quote] 用这个：MAKEINTRESOURCE(IDR_WAVE1) 和用这个，“IDR_WAVE1”没有本质的区别。是一样的。 肯定是不行的，要文件名，你个我个字符串，又不是文件名，有什么用呢？[/quote] 类型转换的作用；查的MSDN ； PlaySound函数,有这个用法！[/quote] 用我在13楼发的那个用法。那个是正宗的msdn上的用法。把你找的那个用法的原文贴过来一下，看看。

user: user-0
content: 引用 11 楼 zjq9931 的回复:[quote=引用 10 楼 my_xxh 的回复:] [quote=引用 5 楼 u013491662 的回复:] 我以前是这么用的  PlaySound((LPCWSTR)IDR_WAVE1,NULL,SND_ASYNC|SND_RESOURCE);  PlaySound函数的第二个参数为NULL，不需要获取包含资源的模块句柄嘛？我试了哈PlaySound((LPCWSTR)IDR_WAVE1,NULL,SND_ASYNC|SND_RESOURCE); 也是能通过编译，运行的起来，就是不能正常播放声音！MSDN上的描述如下图：可我这样写的：PlaySound(MAKEINTRESOURCE(IDR_WAVE1),GetModuleHandle(NULL), SND_ASYNC|SND_RESOURCE);   能运行，就是不能正常执行播放音乐，返回true; 错在？ [/quote] 用这个：MAKEINTRESOURCE(IDR_WAVE1) 和用这个，“IDR_WAVE1”没有本质的区别。是一样的。 肯定是不行的，要文件名，你个我个字符串，又不是文件名，有什么用呢？[/quote] 类型转换的作用；查的MSDN ； PlaySound函数,有这个用法！

user: user-1
content: 第二个参数： hmod  Handle of the executable file that contains the resource to be loaded. This parameter must be NULL unless SND_RESOURCE is specified in fdwSound.   第三个参数： SND_RESOURCE 这样就可以了。

user: user-1
content: 第三个参数，或上这个SND_RESOURCE，似乎是就可以播放资源里面的但是，还不知道具体怎么用。

user: user-1
content: 引用 10 楼 my_xxh 的回复:[quote=引用 5 楼 u013491662 的回复:] 我以前是这么用的  PlaySound((LPCWSTR)IDR_WAVE1,NULL,SND_ASYNC|SND_RESOURCE);  PlaySound函数的第二个参数为NULL，不需要获取包含资源的模块句柄嘛？我试了哈PlaySound((LPCWSTR)IDR_WAVE1,NULL,SND_ASYNC|SND_RESOURCE); 也是能通过编译，运行的起来，就是不能正常播放声音！MSDN上的描述如下图：可我这样写的：PlaySound(MAKEINTRESOURCE(IDR_WAVE1),GetModuleHandle(NULL), SND_ASYNC|SND_RESOURCE);   能运行，就是不能正常执行播放音乐，返回true; 错在？ [/quote] 用这个：MAKEINTRESOURCE(IDR_WAVE1) 和用这个，“IDR_WAVE1”没有本质的区别。是一样的。 肯定是不行的，要文件名，你个我个字符串，又不是文件名，有什么用呢？

user: user-0
content: 引用 5 楼 u013491662 的回复:我以前是这么用的  PlaySound((LPCWSTR)IDR_WAVE1,NULL,SND_ASYNC|SND_RESOURCE);  PlaySound函数的第二个参数为NULL，不需要获取包含资源的模块句柄嘛？我试了哈PlaySound((LPCWSTR)IDR_WAVE1,NULL,SND_ASYNC|SND_RESOURCE); 也是能通过编译，运行的起来，就是不能正常播放声音！MSDN上的描述如下图：可我这样写的：PlaySound(MAKEINTRESOURCE(IDR_WAVE1),GetModuleHandle(NULL), SND_ASYNC|SND_RESOURCE);   能运行，就是不能正常执行播放音乐，返回true; 错在？

user: user-1
content: 引用 5 楼 u013491662 的回复:我以前是这么用的  PlaySound((LPCWSTR)IDR_WAVE1,NULL,SND_ASYNC|SND_RESOURCE);  这样可以？

user: user-1
content: 引用 6 楼 my_xxh 的回复:[quote=引用 4 楼 Saleayas 的回复:] MAKEINTRESOURCE PlaySound(MAKEINTRESOURCE(IDR_WAVE1),GetModuleHandle(NULL), SND_ASYNC|SND_RESOURCE); 编译能通过，程序也能运行起来，就是这个wav格式的音乐文件不能正常播放，测试了哈，PlaySound的返回值为0，莫能正常执行，问题出在什么地方？没有获得包含资源的模块句柄吗？新手学习。谢谢了！[/quote] 这个MAKEINTRESOURCE，只是返回资源的名称。而playsound要求的是文件名。。。肯定是不行的。

user: user-3
content: 直接双击wav文件能否播放。

user: user-0
content: 引用 4 楼 Saleayas 的回复:MAKEINTRESOURCE PlaySound(MAKEINTRESOURCE(IDR_WAVE1),GetModuleHandle(NULL), SND_ASYNC|SND_RESOURCE); 编译能通过，程序也能运行起来，就是这个wav格式的音乐文件不能正常播放，测试了哈，PlaySound的返回值为0，莫能正常执行，问题出在什么地方？没有获得包含资源的模块句柄吗？新手学习。谢谢了！

user: user-5
content: 我以前是这么用的  PlaySound((LPCWSTR)IDR_WAVE1,NULL,SND_ASYNC|SND_RESOURCE);