MultiByteToWideChar
const UINT codePage = 936; // GB 2312.
CCHAR *multiByteString = "源字符串abcd";
// First: get count of multi-byte string.
const DWORD cCh = MultiByteToWideChar(codePage, // Character Page.
0, // Flag, always be 0.
multiByteString, // Multi-byte string.
-1, // '-1' is to determind length automatically.
NULL, // 'NULL' means ignore result. This is based
// on next argument is '0'.
0); // '0' is to get the count of character needed
// instead of to translate.
// Second: allocate enough memory to save result in wide character.
PWCHAR pWideCharString = new WCHAR[cCh];
ZeroMemory(pWideCharString, cCh * sizeof(pWideCharString[0]));
// Third: Translate it!
MultiByteToWideChar(codePage, // Character Page.
0, // Flag, always be 0.
multiByteString, // Multi-byte string.
-1, // Count of character of string above.
pWideCharString, // Target wide character buffer.
cCh); // Count of character of wide character string buffer.
// Fourth: use it!
// ...
// Fifth: deallocate the memory.
delete pWideCharString;
pWideCharString = NULL;

WideCharToMultiByte
const UINT codePage = 936; // GB 2312.
WCHAR *wideCharString = L"源字符串abcd";
// First: get count.
const DWORD cCh = WideCharToMultiByte(codePage,
0,
wideCharString,
-1,
NULL,
0,
NULL, // When the wide character to be traslated
// is not in code page, proc will use this
// variable to fill with. We usually set it
// to NULL.
NULL); // This variable will save the number of
// character which can't be tranlated. We
// usually set it to NULL.
// Second: allocate enough memory to save result.
PCHAR pMultiByteString = new CHAR[cCh];
ZeroMemory(pMultiByteString, cCh * sizeof(pMultiByteString[0]));
// Third: Translate it!
WideCharToMultiByte(codePage,
0,
wideCharString,
-1,
pMultiByteString,
cCh,
NULL,
NULL);
// Fourth: use it!
// ...
// Fifth: deallocate the memory.
delete pMultiByteString;
pMultiByteString = NULL;