Re: WCHAR conversion problem
"I?aki" <Iaki@discussions.microsoft.com> ha scritto nel messaggio
news:E3DC8B26-374D-4000-A3BB-055B83C9B663@microsoft.com...
I need to convert a WCHAR[] to a char* but I don't know how can I do that.
I'm not c++ expert... and I'm using an API with WCHARs...
What I need to convert is fileName of the following struct to a char*:
typedef struct _FbwfCacheDetail {
ULONG cacheSize; // size of cache used by the file
ULONG openHandleCount; // number of currently opened handles
ULONG fileNameLength; // file name length in bytes
WCHAR fileName[1]; // file name (may not be
null-terminated)
} FbwfCacheDetail, *PFbwfCacheDetail;
I've tried the following:
char *FileName = (char *)malloc( MAX_FILENAME_LENGTH );
In modern C++ I would not use this malloc() stuff: you have new,
std::vector, robust string classes like CString[A|W], these are better tools
to build quality code, IMHO.
You may try this function Utf16ToAnsi(), like this:
CStringA filename = Utf16ToAnsi(
Cache_detail->fileName, // UTF-16 string
Cache_detail->fileNameLength // length in *bytes*
);
Note that it is unusual in Windows programming to have length of string
expressed in bytes. Usually length of strings are expressed in TCHARs (which
equals bytes only for ANSI strings, not for Unicode UTF-16 strings...).
Here's the commented code of Utf16ToAnsi()'s body:
<code>
//------------------------------------------------------------------
// Converts a string from Unicode (UTF-16) to ANSI.
// The input string length is specified in bytes (8 bits),
// and the input string could be not NUL terminated.
//------------------------------------------------------------------
CStringA Utf16ToAnsi( const WCHAR * utf16String, ULONG lengthInBytes )
{
// Convert length from bytes to WCHAR count
const int lengthInWChars = lengthInBytes / sizeof(WCHAR);
// Get the size, in bytes, of destination buffer
// (to store ANSI string)
int ansiBufferSize = ::WideCharToMultiByte(
CP_ACP, // current system Windows ANSI code page
0, // default flags
utf16String, // pointer to UTF-16 string to convert
lengthInWChars, // length in wide chars
NULL, // destination buffer (unused)
0, // request size (in bytes) for dest. buffer
NULL, NULL // do not use default char
);
if ( ansiBufferSize == 0 )
{
// Error occurred...
// Throw an exception with GetLastError() or something...
AtlThrowLastWin32();
}
// Allocate destination buffer with proper size
std::vector< char > ansiBuffer( ansiBufferSize );
// Do the conversion
int result = ::WideCharToMultiByte(
CP_ACP, // current system Windows ANSI code page
0, // default flags
utf16String, // pointer to UTF-16 string to convert
lengthInWChars, // length in wide chars
&ansiBuffer[0], // destination buffer
ansiBufferSize, // size (in bytes) of destination buffer
NULL, NULL // do not use default char
);
if ( result == 0 )
{
// Error
AtlThrowLastWin32();
}
// Return a copy of the string
return CStringA( &ansiBuffer[0], ansiBufferSize );
}
</code>
HTH,
Giovanni