关于WCHAR* 和char* 的转换问题,希望各位帮个忙指点一下,谢谢
在编译的时候遇到了这个难题,下面是我的代码:望高人多多指教..........
#include "stdafx.h"#include<stdio.h>#include<windows.h>#include <tlhelp32.h>#include <stdlib.h>#include "defines.h"int __cdecl Kill_process_main(){char * proname={"chrome.exe"};char p[260];int i;HANDLE hSnapshot;hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //进程快照 PROCESSENTRY32 pe;pe.dwSize=sizeof(PROCESSENTRY32);std::string szDst;/* char *orig size_t origsize = strlen(orig) + 1; const size_t newsize = 100; size_t convertedChars = 0; wchar_t wcstring[newsize]; mbstowcs_s(&convertedChars, wcstring, origsize, orig, _TRUNCATE); wcscat_s(wcstring, L\" (wchar_t *)\"); wcout << wcstring << endl; *//*size_t origsize =strlen(p)+1;const size_t newsize =300;size_t convertedChars = 0; pe.szExeFile[newsize];mbstowcs_s(&convertedChars, pe.szExeFile, origsize, p, _TRUNCATE);//mbstowcs(&convertedChars, pe.szExeFile, origsize, p, _TRUNCATE);*///Process32First(hSnapshot,&pe);for(i=0;i<=2;i++){ strcpy(p,proname[0]); Process32First(hSnapshot,&pe); int nCompare; nCompare =WideCharToMultiByte(CP_ACP, NULL, pe.szExeFile, wcslen(pe.szExeFile), p, 260, 0, 0); //nCompare =MultiByteToWideChar(CP_ACP, NULL, p, strlen(p) + 1, pe.szExeFile, 260);*/ do { if(strcmp( pe.szExeFile, p )) //比较 如果相等就是等于 0 { HANDLE hProcess; hProcess=OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE,FALSE,pe.th32ProcessID); if(hProcess) { TerminateProcess(hProcess,0);//关闭进程 } } } while(Process32Next(hSnapshot,&pe));} CloseHandle(hSnapshot); return 0;}
typedef struct tagPROCESSENTRY32W{ DWORD dwSize; DWORD cntUsage; DWORD th32ProcessID; // this process ULONG_PTR th32DefaultHeapID; DWORD th32ModuleID; // associated exe DWORD cntThreads; DWORD th32ParentProcessID; // this process's parent process LONG pcPriClassBase; // Base priority of process's threads DWORD dwFlags; WCHAR szExeFile[MAX_PATH]; // Path} PROCESSENTRY32W;
{ HANDLE hProcess; hProcess=OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE,FALSE,pe.th32ProcessID); if(hProcess) { TerminateProcess(hProcess,0);//关闭进程
DWORD dwFlags,
LPCWSTR lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCSTR lpDefaultChar,
LPBOOL lpUsedDefaultChar
);
[解决办法]
nCompare =WideCharToMultiByte(CP_ACP, NULL, pe.szExeFile, wcslen(pe.szExeFile), p, 260, 0, 0);
在这条语句里,你将pe.szExeFile宽字节字符串的内容转换为p多字节字符串的内容,前者为UNICODE编码,后者为GB_2312编码
strcmp( pe.szExeFile, p )
在这条语句里,你调用strcmp比较这两个字符串
但你真的知道strcmp函数的功能是什么吗?它是将两个char*指针指向的内存的字节逐一比较,直到遇到0结束符位置,不是你叫做“字符串”的东西它就能比较!
pe.szExeFile里面是什么数据?是宽字节字符串。“我是谁abc”这个字符串按照Unicode编码,在里面占用了14字节内存空间。p里面是什么数据?是多字节字符串。“我是谁abc”这个字符串按照GB_2312编码,在里面占用10字节内存空间。哪怕它们保存的是概念上的同一个字符串,因为编码不同,内存中的数据完全不同!所以才需要WideCharToMultiByte这样的函数在它们之间转换。
如果strcmp能够直接比较这两个“字符串”,那你为什么还用WideCharToMultiByte,直接strcpy不就行了吗?按字节拷贝的东西自然按字节比较,你用WideCharToMultiByte函数转换之后再按字节比较,能相等才真是见了鬼。
[解决办法]
strcmp( pe.szExeFile, p )wchar_t*和char*是不能比较的,因为他们的编码方式不一样需要转换
[解决办法]
wchar_t char2wchar(LPCSTR mutibyte)
{
int size=MultiByteToWideChar(CP_ACP,0,mutibyte,-1,NULL,0);
wchar_t *_mutibyte=new wchar_t[size+1];
MultiByteToWideChar(CP_ACP,0,mutibyte,-1,_mutibyte,size);
return _mutibyte;
}
strcmp( pe.szExeFile, p );
delete []_mutibyte;
_mutibyte=0;
[解决办法]
WstrTopChar(LPWSTR wstr)
{
DWORD dwNum = WideCharToMultiByte(CP_MACCP,NULL,wstr,-1,NULL,0,NULL,FALSE);
char *psText;
psText = new char[dwNum];
if(!psText)
{
delete []psText;
}
WideCharToMultiByte (CP_MACCP,NULL,wstr,-1,psText,dwNum,NULL,FALSE);
return psText;
}
StrExeName = WstrTopChar(pe.szExeFile);
if(strcmp( StrExeName , p ))
{
}
楼主试试,
[解决办法]
仅供参考,尽管是VB6
Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As LongPrivate Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long'常用的代码页:const cpUTF8 =65001const cpGB2312 = 936const cpGB18030=54936const cpUTF7 =65000Function MultiByteToUTF16(UTF8() As Byte, CodePage As Long) As String Dim bufSize As Long bufSize = MultiByteToWideChar(CodePage, 0&, UTF8(0), UBound(UTF8) + 1, 0, 0) MultiByteToUTF16 = Space(bufSize) MultiByteToWideChar CodePage, 0&, UTF8(0), UBound(UTF8) + 1, StrPtr(MultiByteToUTF16), bufSizeEnd FunctionFunction UTF16ToMultiByte(UTF16 As String, CodePage As Long) As Byte() Dim bufSize As Long Dim arr() As Byte bufSize = WideCharToMultiByte(CodePage, 0&, StrPtr(UTF16), Len(UTF16), 0, 0, 0, 0) ReDim arr(bufSize - 1) WideCharToMultiByte CodePage, 0&, StrPtr(UTF16), Len(UTF16), arr(0), bufSize, 0, 0 UTF16ToMultiByte = arrEnd FunctionPrivate Sub Command1_Click() MsgBox MultiByteToUTF16(UTF16ToMultiByte("ab中,c", cpUTF8), cpUTF8)End Sub