124 lines
2.4 KiB
C
124 lines
2.4 KiB
C
|
//
|
||
|
// 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
|