// // xstring.h // // Unicode/ansi conversion. // #ifndef XSTRING_H #define XSTRING_H char *UnicodeToAnsi(UINT uCodePage, const WCHAR *pchW, UINT uLenW, char *pchAIn, UINT uSizeA); WCHAR *AnsiToUnicode(UINT uCodePage, const char *pchA, UINT uLenA, WCHAR *pchWIn, UINT uSizeW); void BufferAllocFree(void *pBuffer, void *pAllocMem); #ifdef __cplusplus class WtoA { public: WtoA(const WCHAR* str) { int cch = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL); _pch = new char[cch + 1]; if (_pch) WideCharToMultiByte(CP_ACP, 0, str, -1, _pch, cch, NULL, NULL); } WtoA(const WCHAR* str, ULONG cch) { int cchA = WideCharToMultiByte(CP_ACP, 0, str, cch, NULL, 0, NULL, NULL); _pch = new char[cchA + 1]; if (_pch) WideCharToMultiByte(CP_ACP, 0, str, cch, _pch, cchA, NULL, NULL); } ~WtoA() { delete _pch; } operator char*() { if (_pch) return _pch; Assert(0); return "\0"; } protected: char* _pch; }; class AtoW { public: AtoW(const char* str) { int cch = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); _pch = new WCHAR[cch + 1]; if (_pch) MultiByteToWideChar(CP_ACP, 0, str, -1, _pch, cch); } AtoW(const char* str, ULONG cch) { int cchW = MultiByteToWideChar(CP_ACP, 0, str, cch, NULL, 0); _pch = new WCHAR[cchW + 1]; if (_pch) MultiByteToWideChar(CP_ACP, 0, str, cch, _pch, cchW); } ~AtoW() { delete _pch; } operator WCHAR*() { if (_pch) return _pch; Assert(0); return L"\0"; } protected: WCHAR* _pch; }; class WCHtoWSZ { public: WCHtoWSZ (const WCHAR *pch, ULONG cch) { Assert(pch || !cch); if (cch == (ULONG)(-1)) cch = wcslen(pch); _pch = new WCHAR[cch + 1]; if (_pch) { if (pch && cch) memcpy(_pch, pch, cch * sizeof(WCHAR)); _pch[cch] = L'\0'; } } ~WCHtoWSZ () { delete _pch; } operator WCHAR*() { if (_pch) return _pch; Assert(0); return L"\0"; } protected: WCHAR* _pch; }; #endif // __cplusplus #endif // XSTRING_H