https://support.microsoft.com/en-us/kb/138813
/*
* AnsiToUnicode converts the ANSI string pszA to a Unicode string
* and returns the Unicode string through ppszW. Space for the
* the converted string is allocated by AnsiToUnicode.
*/
HRESULT __fastcall AnsiToUnicode( LPCSTR pszA , LPOLESTR * ppszW)
{
ULONG cCharacters;
DWORD dwError;
// If input is null then just return the same.
if (NULL == pszA)
{
* ppszW = NULL ;
return NOERROR ;
}
// Determine number of wide characters to be allocated for the
// Unicode string.
cCharacters = strlen( pszA ) + 1;
// Use of the OLE allocator is required if the resultant Unicode
// string will be passed to another COM component and if that
// component will free it. Otherwise you can use your own allocator.
* ppszW = (LPOLESTR )CoTaskMemAlloc(cCharacters * 2);
if (NULL == * ppszW)
return E_OUTOFMEMORY ;
// Covert to Unicode.
if (0 == MultiByteToWideChar(CP_ACP , 0, pszA, cCharacters,
* ppszW , cCharacters))
{
dwError = GetLastError();
CoTaskMemFree(* ppszW );
* ppszW = NULL ;
return HRESULT_FROM_WIN32(dwError);
}
return NOERROR ;
/*
* UnicodeToAnsi converts the Unicode string pszW to an ANSI string
* and returns the ANSI string through ppszA. Space for the
* the converted string is allocated by UnicodeToAnsi.
*/
}
HRESULT __fastcall UnicodeToAnsi( LPCOLESTR pszW , LPSTR * ppszA)
{
ULONG cbAnsi, cCharacters;
DWORD dwError;
// If input is null then just return the same.
if (pszW == NULL)
{
* ppszA = NULL ;
return NOERROR ;
}
cCharacters = wcslen( pszW ) + 1;
// Determine number of bytes to be allocated for ANSI string. An
// ANSI string can have at most 2 bytes per character (for Double
// Byte Character Strings.)
cbAnsi = cCharacters * 2;
// Use of the OLE allocator is not required because the resultant
// ANSI string will never be passed to another COM component. You
// can use your own allocator.
* ppszA = (LPSTR )CoTaskMemAlloc(cbAnsi);
if (NULL == * ppszA)
return E_OUTOFMEMORY ;
// Convert to ANSI.
if (0 == WideCharToMultiByte(CP_ACP , 0, pszW, cCharacters, * ppszA ,
cbAnsi, NULL , NULL ))
{
dwError = GetLastError();
CoTaskMemFree(* ppszA );
* ppszA = NULL ;
return HRESULT_FROM_WIN32(dwError);
}
return NOERROR ;
}
用法
LPOLESTR pszFileNameW;
AnsiToUnicode(lpszName, &pszFileNameW);
m_list.InsertItem(0, pszFileNameW);
方法2:
char * lpszName = "ABC";
USES_CONVERSION ;
TCHAR *p = A2W (lpszName);
//同样,还有 W2A
方法3
#include <cstdlib>
char * lpszName = "ABC";
TCHAR wszName[32];
mbstowcs(wszName, lpszName, 32);
//UINCODE转ANSI
wcstombs(lpszName, wszName, 32);
本文为“技术点滴”的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。