//+------------------------------------------------------------------------- // // Microsoft Windows // // Copyright (C) Microsoft Corporation, 1999 - 1999 // // File: strconv.h // //-------------------------------------------------------------------------- // This header contains macros and functions for performing various types of // string conversions, in most cases, these functions are duplicate of others // found in both MFC, and ATL. Unfortunately, when both MFC and ATL are // included within the same translation unit, all of the conversion functions // available in ATL are made unavailable. This file should work in all settings! // The functions, though, in many cases to functions elsewhere have been renamed // to avoid name colisions. The naming convention is similar to the naming // convention used in the C++ standard library. ANSI strings are abbreviated to // str, while wide character strings are abbreviated to wcs. #ifndef STRCONV_H #define STRCONV_H #ifndef __wtypes_h__ #include #endif #ifndef _INC_MALLOC #include #endif namespace microsoft { namespace string_conversion { inline BSTR wcs2BSTR(const wchar_t* ws) throw() // Converts a wide character string to a BSTR. The callee is responsible // for releasing the returned BSTR. A BSTR is always returned, even if ws // is NULL. When ws is NULL, an empty BSTR is returned. This is done so // that the behaviour of this function is similar to those found below. { return ws ? SysAllocString(ws) : SysAllocString(L""); } inline BSTR str2BSTR(const char* s) throw() // Converts the provided narrow string to a BSTR. The BSTR must be released // by the callee. { if (!s) return wcs2BSTR(NULL); const int len = lstrlenA(s)+1; wchar_t* ws = reinterpret_cast(alloca((len)*2)); *ws=0; MultiByteToWideChar(CP_ACP, 0, s, -1, ws, len); return wcs2BSTR(ws); } inline char* wcs2str(char* s, const wchar_t* ws) throw() // Converts the provided wcs to a narrrow string, which will be stored in // the provided space. No overrun checking is done! The narrow string // is returned. { *s=0; WideCharToMultiByte(CP_ACP, 0, ws, -1, s, lstrlenW(ws)+1, NULL, NULL); return s; } inline char* wcs2str(char* s, const wchar_t* ws, int wslen) throw() // Converts the provided wcs to a narrow string, which will be stored // in the provided space. Overrun checking is performed. { *s=0; WideCharToMultiByte(CP_ACP, 0, ws, -1, s, wslen, NULL, NULL); return s; } #define USES_STRCONV int _strconv_length; #define WCS2STR(ws) \ (ws ? (_strconv_length = lstrlenW(ws)+1,\ wcs2str(reinterpret_cast(alloca(_strconv_length)),\ ws, _strconv_length)) : NULL) } // namespace string_conversion } // namespace microsoft #ifndef MICROSOFT_NAMESPACE_ON using namespace microsoft; #ifndef STRING_CONVERSION_NAMESPACE_ON using namespace string_conversion; #endif // STRING_CONVERSION_NAMESPACE_ON #endif // MICROSOFT_NAMESPACE_ON #endif // STRCONV_H