435 lines
9.4 KiB
C
435 lines
9.4 KiB
C
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Microsoft Forms
|
||
|
// Copyright (C) Microsoft Corporation, 1994-2000
|
||
|
//
|
||
|
// File: cstrinout.h
|
||
|
//
|
||
|
// Contents: shell-wide string thunkers, for use by unicode wrappers
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
#ifndef _CSTRINOUT_HXX_
|
||
|
#define _CSTRINOUT_HXX_
|
||
|
|
||
|
#define CP_ATOM 0xFFFFFFFF /* not a string at all */
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CConvertStr (CStr)
|
||
|
//
|
||
|
// Purpose: Base class for conversion classes.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class CConvertStr
|
||
|
{
|
||
|
public:
|
||
|
operator char *();
|
||
|
inline BOOL IsAtom() { return _uCP == CP_ATOM; }
|
||
|
|
||
|
protected:
|
||
|
CConvertStr(UINT uCP);
|
||
|
~CConvertStr();
|
||
|
void Free();
|
||
|
|
||
|
UINT _uCP;
|
||
|
LPSTR _pstr;
|
||
|
char _ach[MAX_PATH * sizeof(WCHAR)];
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CConvertStr::CConvertStr
|
||
|
//
|
||
|
// Synopsis: ctor.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline
|
||
|
CConvertStr::CConvertStr(UINT uCP)
|
||
|
{
|
||
|
_uCP = uCP;
|
||
|
_pstr = NULL;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CConvertStr::~CConvertStr
|
||
|
//
|
||
|
// Synopsis: dtor.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline
|
||
|
CConvertStr::~CConvertStr()
|
||
|
{
|
||
|
Free();
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CConvertStr::operator char *
|
||
|
//
|
||
|
// Synopsis: Returns the string.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline
|
||
|
CConvertStr::operator char *()
|
||
|
{
|
||
|
return _pstr;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CStrIn (CStrI)
|
||
|
//
|
||
|
// Purpose: Converts string function arguments which are passed into
|
||
|
// a Windows API.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class CStrIn : public CConvertStr
|
||
|
{
|
||
|
public:
|
||
|
CStrIn(LPCWSTR pwstr);
|
||
|
CStrIn(LPCWSTR pwstr, int cwch);
|
||
|
CStrIn(UINT uCP, LPCWSTR pwstr);
|
||
|
CStrIn(UINT uCP, LPCWSTR pwstr, int cwch);
|
||
|
int strlen();
|
||
|
|
||
|
protected:
|
||
|
CStrIn();
|
||
|
void Init(LPCWSTR pwstr, int cwch);
|
||
|
|
||
|
int _cchLen;
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CStrIn::CStrIn
|
||
|
//
|
||
|
// Synopsis: Inits the class with a given length
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline
|
||
|
CStrIn::CStrIn(LPCWSTR pwstr, int cwch) : CConvertStr(CP_ACP)
|
||
|
{
|
||
|
Init(pwstr, cwch);
|
||
|
}
|
||
|
|
||
|
inline
|
||
|
CStrIn::CStrIn(UINT uCP, LPCWSTR pwstr, int cwch) : CConvertStr(uCP)
|
||
|
{
|
||
|
Init(pwstr, cwch);
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CStrIn::CStrIn
|
||
|
//
|
||
|
// Synopsis: Initialization for derived classes which call Init.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline
|
||
|
CStrIn::CStrIn() : CConvertStr(CP_ACP)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CStrIn::strlen
|
||
|
//
|
||
|
// Synopsis: Returns the length of the string in characters, excluding
|
||
|
// the terminating NULL.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline int
|
||
|
CStrIn::strlen()
|
||
|
{
|
||
|
return _cchLen;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CStrInMulti (CStrIM)
|
||
|
//
|
||
|
// Purpose: Converts multiple strings which are terminated by two NULLs,
|
||
|
// e.g. "Foo\0Bar\0\0"
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class CStrInMulti : public CStrIn
|
||
|
{
|
||
|
public:
|
||
|
CStrInMulti(LPCWSTR pwstr);
|
||
|
};
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CPPFIn
|
||
|
//
|
||
|
// Purpose: Converts string function arguments which are passed into
|
||
|
// a Win9x PrivateProfile API. Win9x DBCS has a bug where
|
||
|
// passing a string longer than MAX_PATH will fault kernel.
|
||
|
//
|
||
|
// PPF = Private Profile Filename
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class CPPFIn
|
||
|
{
|
||
|
public:
|
||
|
operator char *();
|
||
|
CPPFIn(LPCWSTR pwstr);
|
||
|
|
||
|
private:
|
||
|
char _ach[MAX_PATH];
|
||
|
};
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CPPFIn::operator char *
|
||
|
//
|
||
|
// Synopsis: Returns the string.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline
|
||
|
CPPFIn::operator char *()
|
||
|
{
|
||
|
return _ach;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CStrOut (CStrO)
|
||
|
//
|
||
|
// Purpose: Converts string function arguments which are passed out
|
||
|
// from a Windows API.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class CStrOut : public CConvertStr
|
||
|
{
|
||
|
public:
|
||
|
CStrOut(LPWSTR pwstr, int cwchBuf);
|
||
|
CStrOut(UINT uCP, LPWSTR pwstr, int cwchBuf);
|
||
|
~CStrOut();
|
||
|
|
||
|
int BufSize();
|
||
|
int ConvertIncludingNul();
|
||
|
int ConvertExcludingNul();
|
||
|
protected:
|
||
|
void Init(LPWSTR pwstr, int cwchBuf);
|
||
|
private:
|
||
|
LPWSTR _pwstr;
|
||
|
int _cwchBuf;
|
||
|
};
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CStrOut::BufSize
|
||
|
//
|
||
|
// Synopsis: Returns the size of the buffer to receive an out argument,
|
||
|
// including the terminating NULL.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline int
|
||
|
CStrOut::BufSize()
|
||
|
{
|
||
|
return _cwchBuf * sizeof(WCHAR);
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Multi-Byte ---> Unicode conversion
|
||
|
//
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CConvertStrW (CStr)
|
||
|
//
|
||
|
// Purpose: Base class for multibyte conversion classes.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class CConvertStrW
|
||
|
{
|
||
|
public:
|
||
|
operator WCHAR *();
|
||
|
|
||
|
protected:
|
||
|
CConvertStrW();
|
||
|
~CConvertStrW();
|
||
|
void Free();
|
||
|
|
||
|
LPWSTR _pwstr;
|
||
|
WCHAR _awch[MAX_PATH * sizeof(WCHAR)];
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CConvertStrW::CConvertStrW
|
||
|
//
|
||
|
// Synopsis: ctor.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline
|
||
|
CConvertStrW::CConvertStrW()
|
||
|
{
|
||
|
_pwstr = NULL;
|
||
|
}
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CConvertStrW::~CConvertStrW
|
||
|
//
|
||
|
// Synopsis: dtor.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline
|
||
|
CConvertStrW::~CConvertStrW()
|
||
|
{
|
||
|
Free();
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CConvertStrW::operator WCHAR *
|
||
|
//
|
||
|
// Synopsis: Returns the string.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline
|
||
|
CConvertStrW::operator WCHAR *()
|
||
|
{
|
||
|
return _pwstr;
|
||
|
}
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CStrInW (CStrI)
|
||
|
//
|
||
|
// Purpose: Converts multibyte strings into UNICODE
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class CStrInW : public CConvertStrW
|
||
|
{
|
||
|
public:
|
||
|
CStrInW(LPCSTR pstr) { Init(pstr, -1); }
|
||
|
CStrInW(LPCSTR pstr, int cch) { Init(pstr, cch); }
|
||
|
int strlen();
|
||
|
|
||
|
protected:
|
||
|
CStrInW();
|
||
|
void Init(LPCSTR pstr, int cch);
|
||
|
|
||
|
int _cwchLen;
|
||
|
};
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CStrInW::CStrInW
|
||
|
//
|
||
|
// Synopsis: Initialization for derived classes which call Init.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline
|
||
|
CStrInW::CStrInW()
|
||
|
{
|
||
|
}
|
||
|
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CStrInW::strlen
|
||
|
//
|
||
|
// Synopsis: Returns the length of the string in characters, excluding
|
||
|
// the terminating NULL.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline int
|
||
|
CStrInW::strlen()
|
||
|
{
|
||
|
return _cwchLen;
|
||
|
}
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Class: CStrOutW (CStrO)
|
||
|
//
|
||
|
// Purpose: Converts returned unicode strings into ANSI. Used for [out]
|
||
|
// params (so we initialize with a buffer that should later be
|
||
|
// filled with the correct ansi data)
|
||
|
//
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
class CStrOutW : public CConvertStrW
|
||
|
{
|
||
|
public:
|
||
|
CStrOutW(LPSTR pstr, int cchBuf);
|
||
|
~CStrOutW();
|
||
|
|
||
|
int BufSize();
|
||
|
int ConvertIncludingNul();
|
||
|
int ConvertExcludingNul();
|
||
|
|
||
|
private:
|
||
|
LPSTR _pstr;
|
||
|
int _cchBuf;
|
||
|
};
|
||
|
|
||
|
//+---------------------------------------------------------------------------
|
||
|
//
|
||
|
// Member: CStrOutW::BufSize
|
||
|
//
|
||
|
// Synopsis: Returns the size of the buffer to receive an out argument,
|
||
|
// including the terminating NULL.
|
||
|
//
|
||
|
//----------------------------------------------------------------------------
|
||
|
|
||
|
inline int
|
||
|
CStrOutW::BufSize()
|
||
|
{
|
||
|
return _cchBuf;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
#endif // _CSTRINOUT_HXX_
|