1、Unicode 下 CString 与 char *转换在 Visual C+.NET2005 中,默认的字符集形式是 Unicode,但在 VC6.0 等工程中,默认的字符集形式是多字节字符集(MBCS:Multi-Byte Character Set) ,这样导致在 VC6.0 中非常简单实用的各类字符操作和函数在 VS2005 环境下运行时会报各种各样的错误,这里总结了在 Visual C+.NET2005 环境中 Unicode 字符集下 CString 和 char *之间相互转换的几种方法,其实也就是 Unicode 字符集与 MBCS 字符集转换。 (1)、Unicode 下 C
2、String 转换为 char *方法一:使用 API:WideCharToMultiByte 进行转换CString str = _T(“D:校内项目QQ.bmp“);/注意:以下 n 和 len 的值大小不同,n 是按字符计算的,len 是按字节计算的int n = str.GetLength(); / n = 14, len = 18/获取宽字节字符的大小,大小是按字节计算的int len = WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),NULL,0,NULL,NULL);/为多字节字符数组申请空间,数组大小为按字节计算的宽字节字节大
3、小char * pFileName = new charlen+1; /以字节为单位/宽字节编码转换成多字节编码WideCharToMultiByte(CP_ACP,0,str,str.GetLength(),pFileName,len,NULL,NULL);pFileNamelen+1 = 0; /多字节字符以0结束方法二:使用函数:T2A、W2ACString str = _T(“D:校内项目QQ.bmp“);/声明标识符USES_CONVERSION;/调用函数,T2A 和 W2A 均支持 ATL 和 MFC 中的字符转换char * pFileName = T2A(str); /cha
4、r * pFileName = W2A(str); /也可实现转换注意:有时候可能还需要添加引用#include (2)、Unicode 下 char *转换为 CString方法一:使用 API:MultiByteToWideChar 进行转换char * pFileName = “D:校内项目QQ.bmp“;/计算 char *数组大小,以字节为单位,一个汉字占两个字节int charLen = strlen(pFileName);/计算多字节字符的大小,按字符计算。int len = MultiByteToWideChar(CP_ACP,0,pFileName,charLen,NULL,
5、0);/为宽字节字符数组申请空间,数组大小为按字节计算的多字节字符大小TCHAR *buf = new TCHARlen + 1;/多字节编码转换成宽字节编码MultiByteToWideChar(CP_ACP,0,pFileName,charLen,buf,len);buflen = 0; /添加字符串结尾,注意不是 len+1/将 TCHAR 数组转换为 CStringCString pWideChar;pWideChar.Append(buf);/删除缓冲区delete buf;方法二:使用函数:A2T、A2Wchar * pFileName = “D:校内项目QQ.bmp“;USES_
6、CONVERSION;CString s = A2T(pFileName);/CString s = A2W(pFileName);方法三:使用_T 宏,将字符串转换为宽字符/多字节字符集,在 vc6 和 vc7 种可以编译通过的语句,但 VS2005 不能通过,默认为 Unicode 字符集/AfxMessageBox(“加载数据失败“,0);/书写代码使用 TEXT(“)或_T(“),文本在 UNICODE 和非 UNICODE 程序里都通用AfxMessageBox(_T(“加载数据失败“),0); 注意:直接转换在基于 MBCS 的工程可以,但在基于 Unicode 字符集的工程中直接
7、转换是不可行的,CString 会以 Unicode 的形式来保存数据,强制类型转换只会返回第一个字符。Unicode 下CString 转 TCHARTCHAR* szMsg = new TCHARwcslen(strAdbCmd); szMsg = strAdbCmd.GetBuffer(strAdbCmd.GetLength();strAdbCmd.ReleaseBuffer();用完了别忘了 delete szMsg;CString 转 char*char * charP;CString strP;WideCharToMultiByte(CP_OEMCP,0,(LPCTSTR)strP
8、,-1,charP,260,0,false);char* TCHAR*转 CStringchar cstr20=”sdaww”;TCHAR tcstr20=_T(”unicode”);CString str=CString(cstr);CString str1=CString(tcstr);CString 转 intCString strNum=_T(“”);int value = _ttoi(static_cast(strNum); 或者int value = _ttoi(strNum);int 转 CStringint ia=1232;CString stri= stri.Format(_
9、T(“%d”),ia);多字节字符集下Cstring 转化为 char转化成数组:Cstring str=”convert”;char char_str 512;strncpy_s(char_str,(LPCTSTR)str_sum,sizeof(char_str); 转化成 char 指针:char * ch_a =(char*)str.GetBuffer(str.GetLength(); char 转化为 Cstring Cstring str;char szBuff2048;str.Format(“%s“,szBuff);CString 转 int :n=atoi(str);文介绍如何在
10、 VC 资源文件中加入自己的声音资源,使自己的应用程序可以播放声音。1,首先用文本编辑器(如记事本)打开资源文件(.rc 文件)在最后加入自己的声音资源,如下IDW WAVE “c:kavsoundvirus.wav“保存资源文件。2,在应用程序中要播放声音的地方启动另一线程,用来播放声音AfxBeginThread(AFX_THREADPROC)sound,NULL,THREAD_PRIORITY_NORMAL);3,添加线程回调函数这里介绍加载资源的方法。首先用函数 AfxGetInstanceHandle()获得实例的句柄,其次用函数 FindResource 找到自己的声音资源。HRS
11、RC FindResource(HMODULE hModule, / module handleLPCTSTR lpName, / resource nameLPCTSTR lpType / resource type)找到声音资源后,要用 LoadResource 加入该资源HGLOBAL LoadResource(HMODULE hModule, / module handleHRSRC hResInfo / resource handle);最后锁定资源内存块,并返回所标定内存块的虚拟内存地址。如果该资源被成功锁定的话,则返回值指向该资源开始处的第一个字节:LPVOID pv=LockR
12、esource()注意:若上述四步中的任何一步发生问题,则返回并释放相应的内存。接下去要做的事情就是根据文件数据类型进行数据加载。UINT CPlaySoundView:sound(LPVOID pParam)HINSTANCE h=AfxGetInstanceHandle();HRSRC hr=FindResource(h,“IDW“,“WAVE“);HGLOBAL hg=LoadResource(h,hr);LPSTR lp=(LPSTR)LockResource(hg);sndPlaySound(lp,SND_MEMORY|SND_SYNC);FreeResource(hg);retur
13、n 0;播放声音文件的高级方法作者: wei 发表日期: 2007-12-25 复制链接 收藏本文介绍如何在 VC 资源文件中加入自己的声音资源,使自己的应用程序可以播放声音。1、首先用文本编辑器(如记事本)打开资源文件(.rc 文件)在最后加入自己的声音资源,如下 IDW WAVE “c:kavsoundvirus.wav“size=5/size 保存资源文件。 2、在应用程序中要播放声音的地方启动另一线程,用来播放声音:AfxBeginThread(AFX_THREADPROC)sound,NULL,THREAD_PRIORITY_NORMAL);3、添加线程回调函数这里介绍加载资源的方法
14、。首先用函数 AfxGetInstanceHandle()获得实例的句柄,其次用函数 FindResource 找到自己的声音资源。HRSRC FindResource( HMODULE hModule, / module handle LPCTSTR lpName, / resource name LPCTSTR lpType / resource type)找到声音资源后,要用 LoadResource 加入该资源HGLOBAL LoadResource( HMODULE hModule, / module handle HRSRC hResInfo / resource handle);
15、最后锁定资源内存块,并返回所标定内存块的虚拟内存地址。如果该资源被成功锁定的话,则返回值指向该资源开始处的第一个字节:LPVOID pv=LockResource() 注意:若上述四步中的任何一步发生问题,则返回并释放相应的内存。接下去要做的事情就是根据文件数据类型进行数据加载。 UINT CPlaySoundView:sound(LPVOID pParam) HINSTANCE h=AfxGetInstanceHandle(); HRSRC hr=FindResource(h,“IDW“,“WAVE“); HGLOBAL hg=LoadResource(h,hr); LPSTR lp=(LP
16、STR)LockResource(hg); sndPlaySound(lp,SND_MEMORY|SND_SYNC); FreeResource(hg); return 0;在 Visual C+资源文件中加入声音资源 tags: visual 资源 文件 中加 加入 入声 声音 本文介绍如何在 VC 资源文件中加入自己的声音资源,使自己的应用程序可以播放声音。1、首先用文本编辑器(如记事本)打开资源文件(.rc 文件)在最后加入自己的声音资源,如下 IDW WAVE “c:kavsoundvirus.wav“保存资源文件。 2、在应用程序中要播放声音的地方启动另一线程,用来播放声音:AfxB
17、eginThread(AFX_THREADPROC)sound,NULL,THREAD_PRIORITY_NORMAL);3、添加线程回调函数这里介绍加载资源的方法。首先用函数 AfxGetInstanceHandle()获得实例的句柄,其次用函数 FindResource 找到自己的声音资源。HRSRC FindResource( HMODULE hModule, / module handle LPCTSTR lpName, / resource name LPCTSTR lpType / resource type)找到声音资源后,要用 LoadResource 加入该资源HGLOBAL
18、 LoadResource( HMODULE hModule, / module handle HRSRC hResInfo / resource handle);最后锁定资源内存块,并返回所标定内存块的虚拟内存地址。如果该资源被成功锁定的话,则返回值指向该资源开始处的第一个字节:LPVOID pv=LockResource() 注意:若上述四步中的任何一步发生问题,则返回并释放相应的内存。接下去要做的事情就是根据文件数据类型进行数据加载。 UINT CPlaySoundView:sound(LPVOID pParam) HINSTANCE h=AfxGetInstanceHandle();
19、HRSRC hr=FindResource(h,“IDW“,“WAVE“); HGLOBAL hg=LoadResource(h,hr); LPSTR lp=(LPSTR)LockResource(hg); sndPlaySound(lp,SND_MEMORY|SND_SYNC); FreeResource(hg); return 0;本文介绍如何在 VC 资源文件中加入自己的声音资源,使自己的应用程序可以播放声音。首先用函数 AfxGetInstanceHandle()获得实例的句柄,其次用函数 FindResource 找到自己的声音资源。HRSRC FindResource( HMODU
20、LE hModule, / module handle LPCTSTR lpName, / resource name LPCTSTR lpType / resource type) 找到声音资源后,要用 LoadResource 加入该资源 HGLOBAL LoadResource( HMODULE hModule, / module handle HRSRC hResInfo / resource handle); 最后锁定资源内存块,并返回所标定内存块的虚拟内存地址。VC+中播放声音的方法声音是多媒体的一个重要组成部分,在应用程序中加入声音可以使界面更友好。在 VC+中可以根据不同的应用
21、要求,用不同的方法实现声音的播放。一播放声音文件的简单方法在 VC+ 中的多媒体动态连接库中提供了一组与音频设备有关的函数。利用这些函数可以方便地播放声音。最简单的播放声音方法就是直接调用 VC+中提供的声音播放函数 BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound ); 或 BOOL PlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound );其中参数 lpszSound 是需要播放声音的.WAV 文件的路径和文件名, hmod 在这里为 NULL,fuSound 是播放声音的标志,详
22、细说明请参考 VC+中的帮助。 例如播放 C:soundmusic.wav 可以用 sndPlaySound (“c:soundmusic.wav“,SND_ASYNC);或 PlaySound(“c:soundmusic.wav“,NULL, SND_ASYNC|SND_NODEFAULT );如果没有找到 music.wav 文件,第一种格式将播放系统默认的声音,第二种格式不会播放系统默认的声音。二将声音文件加入到程序中在 VC+的程序设计中,可以利用各种标准的资源,如位图,菜单,对话框等。同时VC+也允许用户自定义资源,因此我们可以将声音文件作为用户自定义资源加入程序资源文件中,经过编译
23、连接生成 EXE 文件,实现无.WAV 文件的声音播放。要实现作为资源的声音文件的播放,首先要在资源管理器中加入待播放的声音文件(实现过程并不复杂,这里不在叙述)。假设生成的声音文件资源标识符为 IDR_WAVE1。在播放时只需要调用下面的语句:PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(), SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);其中 MAKEINTRESOURCE()宏将整数资源标识符转变为字符串,AfxGetResourceHandle()函数返回包含资源的模块
24、句柄,SND_RESOURCE 是必须的标志。作为资源的声音文件的第二种播放方法是把资源读入内存后作为内存数据播放。具体步骤入下:1获得包含资源的模块句柄:HMODULE hmod=AfxGetResourceHandle(); 2检索资源块信息:HRSRC hSndResource=FindResource(hmod,MAKEINTRESOURCE(IDR_WAVE1),_T(“WAVE“);3. 装载资源数据并加锁:HGLOBAL hGlobalMem=LoadResource(hmod,hSndResource);LPCTSTR lpMemSound=(LPCSTR)LockResour
25、ce(hGlobalMem);4播放声音文件:sndPlaySound(lpMemSound,SND_MEMORY);5释放资源句柄:FreeResource(hGlobalMem); 三播放声音文件的高级方法在 VC+中提供了一组对音频设备及多媒体文件直接进行操作的函数。利用这些函数可以灵活地对声音文件进行各种处理。首先介绍几个要用到的数据结构。WAVEFORMATEX 结构定义了 WAVE 音频数据文件的格式。WAVEHDR 结构定义了波形音频缓冲区。读出的数据首先要填充此缓冲区才能送音频设备播放。WAVEOUTCAPS 结构描述了音频设备的性能。MMCKINFO 结构包含了 RIFF 文
26、件中一个块的信息。详细的说明请参考 VC+中的帮助。下面给出程序流程简图及程序源代码清单,在 VC+环境下可直接使用:源程序清单如下:LPSTR szFileName;/声音文件名MMCKINFO mmckinfoParent;MMCKINFO mmckinfoSubChunk;DWORD dwFmtSize;HMMIO m_hmmio;/音频文件句柄DWORD m_WaveLong;HPSTR lpData;/音频数据HANDLE m_hData;HANDLE m_hFormat;WAVEFORMATEX * lpFormat;DWORD m_dwDataOffset;DWORD m_dwD
27、ataSize;WAVEHDR pWaveOutHdr;WAVEOUTCAPS pwoc;HWAVEOUT hWaveOut;/打开波形文件if(!(m_hmmio=mmioOpen(szFileName,NULL,MMIO_READ|MMIO_ALLOCBUF)/File open ErrorError(“Failed to open the file.“);/错误处理函数return false;/检查打开文件是否是声音文件mmckinfoParent.fccType =mmioFOURCC(W,A,V,E);if(mmioDescend(m_hmmio,(LPMMCKINFO)if(mm
28、ioDescend(m_hmmio,m_hFormat=LocalAlloc(LMEM_MOVEABLE,LOWORD(dwFmtSize);if(!m_hFormat)/failed alloc memorylpFormat=(WAVEFORMATEX*)LocalLock(m_hFormat);if(!lpFormat)/failed to lock the memoryif(unsigned long)mmioRead(m_hmmio,(HPSTR)lpFormat,dwFmtSize)!=dwFmtSize)/failed to read format chunk/离开 fmt 块mm
29、ioAscend(m_hmmio,/寻找 data 块mmckinfoSubChunk.ckid=mmioFOURCC(d,a,t,a);if(mmioDescend(m_hmmio,m_dwDataOffset =mmckinfoSubChunk.dwDataOffset ;if(m_dwDataSize=0L)/no data in the data chunk/为音频数据分配内存lpData=new charm_dwDataSize;if(!lpData)/faileif(mmioSeek(m_hmmio,SoundOffset,SEEK_SET)0)/Failed to read th
30、e data chunkm_WaveLong=mmioRead(m_hmmio,lpData,SoundLong);if(m_WaveLong0)/Failed to read the data chunk/检查音频设备,返回音频输出设备的性能if(waveOutGetDeVCaps(WAVE_MAPPER,pWaveOutHdr.dwBufferLength =m_WaveLong;pWaveOutHdr.dwFlags =0;if(waveOutPrepareHeader(hWaveOut,waveOutClose(hWaveOut);LocalUnlock(m_hFormat);Loca
31、lFree(m_hFormat);delete lpData; 说明:1)以上使用的音频设备和声音文件操作函数的声明包含在 mmsystem.h 头文件中,因此在程序中必须用#include “mmsystem.h“语句加入头文件。同时在编译时要加入动态连接导入库 winmm.lib,具体实现方法是从 Developer Studio 的 Project 菜单中选择 Settings,然后在Link 选项卡上的 Object/Library Modules 控制中加入 winmm.lib。2)在 pWaveOutHdr.lpData中指定不同的数据,可以播放音频数据文件中任意指定位置的声音。3
32、) 以上程序均在VC+6.0 中调试通过,在文中省略了对错误及异常情况的处理,在实际应用中必须加入。四结论在 VC+中可以根据应用需要采用不同的方法播放声音文件。简单应用可以直接调用声音播放函数。第二种方法可以把声音作为资源加入可执行文件中。如果在播放之前要对声音数据进行处理,可用第三种方法。参考书目:1. 美 Paul Perry 陈向群 等译多媒体开发指南 清华大学出版社2. 美 Peter Norton, Rob McGregor 孙凤英 等译MFC 开发 Windows95/NT4 应用程序 清华大学出版社 19983. 周敬利 多媒体声卡技术及应用 电子工业出版社 1998本文介绍如
33、何在资源文件中加入自己的声音资源,使自己的应用程序可以播放声音。1、首先用文本编辑器(如记事本)打开资源文件(.rc 文件)在最后加入自己的声音资源,如下 IDW WAVE “c:kavsoundvirus.wav“保存资源文件。 2、在应用程序中要播放声音的地方启动另一线程,用来播放声音:AfxBeginThread(AFX_THREADPROC)sound,NULL,THREAD_PRIORITY_NORMAL);3、添加线程回调函数这里介绍加载资源的方法。首先用函数 AfxGetInstanceHandle()获得实例的句柄,其次用函数 FindResource 找到自己的声音资源。HR
34、SRC FindResource(HMODULE hModule, / module handleLPCTSTR lpName, / resource nameLPCTSTR lpType / resource type)找到声音资源后,要用 LoadResource 加入该资源HGLOBAL LoadResource(HMODULE hModule, / module handleHRSRC hResInfo / resource handle);最后锁定资源内存块,并返回所标定内存块的虚拟内存地址。如果该资源被成功锁定的话,则返回值指向该资源开始处的第一个字节:LPVOID pv=Lock
35、Resource() 注意:若上述四步中的任何一步发生问题,则返回并释放相应的内存。接下去要做的事情就是根据文件数据类型进行数据加载。 UINT CPlaySoundView:sound(LPVOID pParam)HINSTANCE h=AfxGetInstanceHandle();HRSRC hr=FindResource(h,“IDW“,“WAVE“);HGLOBAL hg=LoadResource(h,hr);LPSTR lp=(LPSTR)LockResource(hg);sndPlaySound(lp,SND_MEMORY|SND_SYNC);FreeResource(hg);return 0;