char* 与wchar_t*类型之间的转换(代码实测可行)

本文提供了一种在VS2010环境下实现不同字符类型转换的方法,包括从char到wchar_t及从wchar_t到char的转换过程。通过具体的C++代码示例介绍了如何使用MultiByteToWideChar和WideCharToMultiByte函数。
相信会有很多人从VC++6.0环境转移到VS2010后会遇到各种各样的问题,其中一个便是各种字符类型转换的问题,这在6.0下面很少遇到,遇到了强转即可,而在VS2010下面是不可行的。在我遇到这个问题的时候,在网上搜索了很多的参考资料,但其代码都各有问题,对我来说,启发是有的,所以本文章就是解决各字符类型转换的绝好贴。好了,废话不多说,进入正题。
源码如下:

#include <Windows.h> 
#include<iostream>
using namespace std;


//类型转换
//function: wcharTochar
//purpose:WCHAR 、wchar_t、LPWSTR to char
void wcharTochar(const wchar_t *wchar, char *chr, int length)  
{  
WideCharToMultiByte( CP_ACP, 0, wchar, -1,  chr, length, NULL, NULL );  

//function: charTowchar
//purpose:char to WCHAR 、wchar_t、LPWSTR etc
void charTowchar(const char *chr, wchar_t *wchar)
{     
MultiByteToWideChar( CP_ACP, 0, chr,strlen(chr)+1, wchar, strlen(chr)+1);
}  
int main()
{
char chr[30]="char to wchar_t";
wchar_t *wch = (wchar_t *)malloc(sizeof(wchar_t) *20);  
charTowchar(chr, wch); 
wcout<<wch<<endl;
free(wch);
wch=NULL;


char chr1[30]={'0'};
wchar_t *wch1=L"wchar_t to char";
wcharTochar(wch1,chr1,sizeof(chr1));
cout<<chr1<<endl;


while(1);
}
函数一:
 //function: charTowchar
 //purpose:char to WCHAR 、wchar_t、LPWSTR etc


void charTowchar(const char *chr, wchar_t *wchar) 
{     
    MultiByteToWideChar( CP_ACP, 0, chr,strlen(chr)+1, wchar,strlen(chr)+1);  
}  


关于函数  MultiByteToWideChar()
1、功能说明:该函数映射一个字符串到一个宽字符(unicode)的字符串。由该函数映射的字符串没必要是多字节字符组。因为在VS2005以后,编码方式默认为Unicode,而传统上使用ANSI方式,所以需要转换;
2、函数原型:
int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cchMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar
);
参数说明各位百度一下即可
函数二:
  //function: wcharTochar
  //purpose : WCHAR 、wchar_t、LPWSTR to char


void wcharTochar(const wchar_t *wchar, char *chr, int length)  
{  
    WideCharToMultiByte( CP_ACP, 0, wchar, -1, chr, length, NULL, NULL );  
}  


关于函数   WideCharToMultiByte
1、函数功能:该函数映射一个unicode字符串到一个多字节字符串。
2、函数原型及参数说明:
int WideCharToMultiByte(
UINT CodePage, //指定执行转换的代码页


DWORD dwFlags, //允许你进行额外的控制,它会影响使用了读音符号(比如重音)的字符


LPCWSTR lpWideCharStr, //指定要转换为宽字节字符串的缓冲区


int cchWideChar, //指定由参数lpWideCharStr指向的缓冲区的字符个数


LPSTR lpMultiByteStr, //指向接收被转换字符串的缓冲区


int cchMultiByte, //指定由参数lpMultiByteStr指向的缓冲区最大值


LPCSTR lpDefaultChar, //遇到一个不能转换的宽字符,函数便会使用pDefaultChar参数 指向的字符


LPBOOL pfUsedDefaultChar //至少有一个字符不能转换为其多字节形式,函数就会把这个变量设为TRUE
);
以下代码有没有问题: // 功能:通过U盘盘符得到U盘的ID 包含pid, vid // 入口参数: // [out] csDeviceID:设备ID信息, 如 USB\VID_17EF&PID_3801\907117000F7F // [in] csDiskSymbol:可移动设备的盘符 单个字母 如 H // 返回值: // 成功返回true // 失败返回false BOOL GetDiskDeviceIDBySymbol(PCHAR csDiskSymbol, PCHAR csDeviceID) { //判断该盘符对应的磁盘类型 //WriteLog("csDiskSymbol1", FALSE); //WriteLog(csDiskSymbol, TRUE); HANDLE hVolume = CreateFile(csDiskSymbol, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, NULL, NULL); if (hVolume == INVALID_HANDLE_VALUE) { return FALSE; } //WriteLog("csDiskSymbol2", FALSE); //WriteLog(csDiskSymbol, TRUE); //通过DeviceIoControl获取设备的STORAGE_DEVICE_NUMBER STORAGE_DEVICE_NUMBER sdnDiskDeviceNum; //包含有关设备的信息。 DWORD dwBytesReturned = 0; if (!DeviceIoControl(hVolume, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &sdnDiskDeviceNum, sizeof(sdnDiskDeviceNum), &dwBytesReturned, NULL)) { //m_csErrorMsg.Format(_T("DeviceIoControl fail, error code:%d"), GetLastError()); return FALSE; } CloseHandle(hVolume); if (sdnDiskDeviceNum.DeviceNumber == -1) { return FALSE; } //WriteLog("csDiskSymbol3", FALSE); //WriteLog(csDiskSymbol, TRUE); // //已根据盘符得到设备的STORAGE_DEVICE_NUMBER,然后枚举USB设备,找到相同的STORAGE_DEVICE_NUMBER的设备, (只需比较DeviceNumber和DeviceType) const GUID* pGuid = &GUID_DEVINTERFACE_DISK; //GUID_DEVINTERFACE_DISK GUID_DEVINTERFACE_USB_DEVICE HDEVINFO hDevInfo = SetupDiGetClassDevs(pGuid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); if (hDevInfo == INVALID_HANDLE_VALUE) { //m_csErrorMsg.Format(_T("SetupDiGetClassDevs, error code:%d"), GetLastError()); return FALSE; } SP_DEVINFO_DATA DevInfoData; DevInfoData.cbSize = sizeof(SP_DEVINFO_DATA); SP_DEVICE_INTERFACE_DATA DevInterfaceData; DevInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); PSP_DEVICE_INTERFACE_DETAIL_DATA pDevInterfaceDetailData = NULL; //SetupDiGetDeviceInterfaceDetail用于存放信息,需要根据实际大小动态分配 DWORD dwRequiredSize = 0; //保存SetupDiGetDeviceInterfaceDetail返回的实际需要的缓存区大小 DWORD dwInstance = 0; //设备Instance //WriteLog("csDiskSymbol4", FALSE); //WriteLog(csDiskSymbol, TRUE); //枚举所有设备 DWORD index = 0; while (SetupDiEnumDeviceInterfaces(hDevInfo, NULL, pGuid, index, &DevInterfaceData)) { //先直接调用函数,目的是获取第一个设备所需要的缓存区大小dwRequiredSize; SetupDiGetDeviceInterfaceDetail(hDevInfo, &DevInterfaceData, NULL, 0, &dwRequiredSize, &DevInfoData); //得到大小后分配内存 pDevInterfaceDetailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(dwRequiredSize); pDevInterfaceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); //再次调用获取信息 if (!SetupDiGetDeviceInterfaceDetail(hDevInfo, &DevInterfaceData, pDevInterfaceDetailData, dwRequiredSize, &dwRequiredSize, &DevInfoData)) { //m_csErrorMsg.Format(_T("SetupDiGetDeviceInterfaceDetail, error code:%d"), GetLastError()); free(pDevInterfaceDetailData); SetupDiDestroyDeviceInfoList(hDevInfo); return FALSE; } HANDLE hDrive = CreateFile(pDevInterfaceDetailData->DevicePath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hDrive == INVALID_HANDLE_VALUE) { //m_csErrorMsg.Format(_T("CreateFile INVALID_HANDLE_VALUE, error code:%d"), GetLastError()); free(pDevInterfaceDetailData); SetupDiDestroyDeviceInfoList(hDevInfo); return FALSE; } STORAGE_DEVICE_NUMBER sdnDeviceInfoByEnumDevice; //每次枚举时获取的设备信息 DWORD dwBytesReturned2 = 0; if (DeviceIoControl(hDrive, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &sdnDeviceInfoByEnumDevice, sizeof(sdnDeviceInfoByEnumDevice), &dwBytesReturned2, NULL )) { // 比较由盘符获取的DeviceNumber,DeviceType枚举时获取的DeviceNumber,DeviceType,相同则说明盘符对应此USB设备 if (sdnDiskDeviceNum.DeviceNumber == sdnDeviceInfoByEnumDevice.DeviceNumber && sdnDiskDeviceNum.DeviceType == sdnDeviceInfoByEnumDevice.DeviceType) { dwInstance = DevInfoData.DevInst; } } free(pDevInterfaceDetailData); CloseHandle(hDrive); ++index; } //WriteLog("csDiskSymbol5", FALSE); //WriteLog(csDiskSymbol, TRUE); if (index == 0) { //m_csErrorMsg.Format(_T("SetupDiEnumDeviceInterfaces, error code:%d"), GetLastError()); SetupDiDestroyDeviceInfoList(hDevInfo); return FALSE; } //m_csErrorMsg.Format(_T("SetupDiEnumDeviceInterfaces, error code:%d"), GetLastError()); //获取InstanceParent DWORD dwInstanceParent = 0; CM_Get_Parent(&dwInstanceParent, dwInstance, 0); WCHAR buffer[256] = { 0 }; CM_Get_Device_ID(dwInstanceParent, buffer, sizeof(buffer), 0); // 得到设备ID,如 USB\VID_17EF&PID_3801\907117000F7F SetupDiDestroyDeviceInfoList(hDevInfo); sprintf(csDeviceID, "%s", buffer); //csDeviceID.Format(_T("%s"), buffer); //找到的设备的ID, 我也不知道有没有可能两个设备这个ID是相同的 //csDeviceID.MakeUpper(); //WriteLog("csDiskSymbol6", FALSE); //WriteLog(csDiskSymbol, TRUE); return TRUE; }
最新发布
11-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值