//+------------------------------------------------------------- // Microsoft OLE // Copyright (C) Microsoft Corporation, 1994-1995. // // File: convert.cxx // // Contents: Conversion functions for various things. // // Classes: // // Functions: TStrToWStr // WStrToTStr // MakeUnicodeString // MakeSingleByteString // // History: 20-Feb-95 AlexE Created // 29-Jan-98 FarzanaR Ported from ctoleui tree //--------------------------------------------------------------- #include #pragma hdrstop // Debug Object declaration DH_DECLARE; //+------------------------------------------------------------------------- // // Function: TStrToWStr // // Synopsis: Converts a TCHAR string to a WCHAR string // // Arguments: [pszSource] -- The string to convert, NULL is valid // [ppszDest] -- The location to store the new string // // Returns: S_OK if the conversion was successful, another HRESULT // if it was not. // // History: 4-20-95 kennethm Created // // Notes: If unicode is defined this function allocates memory for // the new string and does a simple 'strcpy'. // // If unicode is NOT defined, a CHAR to WCHAR conversion is // performed. // // If *ppszDest is non NULL when this function returns, the // caller is responsible for freeing the memory allocated at // [*ppszDest] // //-------------------------------------------------------------------------- HRESULT TStrToWStr(LPCTSTR pszSource, LPWSTR *ppszDest) { // // Make sure the destination is a valid address // if (IsBadWritePtr(ppszDest, sizeof(ppszDest))) { DH_ASSERT(!"TStrToWStr(): Bad destination pointer"); return E_INVALIDARG; } if (IsBadReadPtr(pszSource, sizeof(TCHAR))) { DH_ASSERT(!"TStrToWStr(): Bad source pointer"); return E_INVALIDARG; } if ('\0' == *pszSource) { *ppszDest = NULL; DH_ASSERT(!"TStrToWStr(): Source string is empty"); return E_INVALIDARG ; } #ifdef UNICODE // // If we're in a unicode world then this whole thing was in vain // but we allocate memory and copy the string anyhow // *ppszDest = new WCHAR[lstrlen(pszSource) + 1]; if (NULL == *ppszDest) { return E_OUTOFMEMORY; } lstrcpy(*ppszDest, pszSource); return S_OK; #else // // Otherwise we do the conversion // return MakeUnicodeString(pszSource, ppszDest); #endif } //+------------------------------------------------------------------------- // // Function: WStrToTStr // // Synopsis: Converts a WCHAR string into a TCHAR string // // Arguments: [pszSource] -- The string to convert, NULL is valid // [ppszDest] -- The location to store the new string // // Returns: S_OK if the conversion was successful, another HRESULT // if not. // // History: 12-May-1995 alexe Created // // Notes: If unicode is defined this function allocates memory for // the new string and does a simple 'strcpy'. // // If unicode is NOT defined, a WCHAR to CHAR conversion is // performed. // // If *ppszDest is non NULL when this function returns, the // caller is responsible for freeing the memory allocated at // [*ppszDest] // //-------------------------------------------------------------------------- HRESULT WStrToTStr(LPCWSTR pszSource, LPTSTR *ppszDest) { // // Make sure the destination is a valid address // if (IsBadWritePtr(ppszDest, sizeof(ppszDest))) { DH_ASSERT(!"WStrToTStr(): Bad destination pointer"); return E_INVALIDARG; } if (IsBadReadPtr(pszSource, sizeof(WCHAR))) { DH_ASSERT(!"WStrToTStr(): Bad source pointer"); return E_INVALIDARG; } if ('\0' == *pszSource) { *ppszDest = NULL; DH_ASSERT(!"WStrToTStr(): Source string is empty"); return E_INVALIDARG ; } #ifdef UNICODE // // If we're in a unicode world then this whole thing was in vain // but we allocate memory and copy the string anyhow // *ppszDest = new WCHAR[lstrlen(pszSource) + 1]; if (NULL == *ppszDest) { return E_OUTOFMEMORY; } lstrcpy(*ppszDest, pszSource); return S_OK; #else // // Otherwise we do the conversion // return MakeSingleByteString(pszSource, ppszDest); #endif } //+------------------------------------------------------------------- // Member: MakeUnicodeString // // Synopsis: Converts an LPCSTR into an LPWSTR. This function is // intended to be a helper function for other functions, // TStrToWStr() in particular, so it does NOT do any // parameter validation. // // Arguments: [pszSource] - The string to convert. // // [ppszDest] - A place to put pointer to new string. // // Returns: S_OK if all goes well, another HRESULT if not. // // Remarks: The user of this function is responsible for freeing // the memory allocated by this function using the // current 'delete' operator implementation. // // History: 07-Mar-95 AlexE Created // 28-Mar-95 AlexE Moved from strhelp.cxx //-------------------------------------------------------------------- HRESULT MakeUnicodeString(LPCSTR pszSource, LPWSTR *ppszDest) { HRESULT hr = S_OK ; INT nLen = 0 ; LPWSTR pszTmp = NULL ; // // Find the length of the string in UNICODE // SetLastError(0) ; nLen = MultiByteToWideChar( CP_ACP, 0, pszSource, -1, NULL, 0) ; DH_ASSERT(0 != nLen) ; pszTmp = new WCHAR [ nLen + 1 ] ; if (NULL == pszTmp) { hr = E_OUTOFMEMORY ; } if (S_OK == hr) { SetLastError(0) ; if (nLen != MultiByteToWideChar( CP_ACP, 0, pszSource, -1, pszTmp, nLen)) { hr = HRESULT_FROM_WIN32(GetLastError()) ; DH_ASSERT(S_OK == hr) ; } } if (S_OK == hr) { *ppszDest = pszTmp ; } else { if (NULL != pszTmp) { delete pszTmp ; } } return hr ; } //+------------------------------------------------------------------- // Member: MakeSingleByteString // // Synopsis: Converts an LPCWSTR into an LPSTR. This function is // intended to be a helper function for other functions, // WStrToTStr() in particular, so it does NOT do any // parameter validation. // // Arguments: [pszSource] - The string to convert. // // [ppszDest] - A place to put pointer to new string. // // Returns: S_OK if all goes well, another HRESULT if not. // // Remarks: The user of this function is responsible for freeing // the memory allocated by this function using the // current 'delete' operator implementation. // // History: 07-Mar-95 AlexE Created // 28-Mar-95 AlexE Moved from strhelp.cxx //-------------------------------------------------------------------- HRESULT MakeSingleByteString(LPCWSTR pszSource, LPSTR *ppszDest) { HRESULT hr = S_OK ; INT nLen ; LPSTR pszTmp ; SetLastError(0) ; nLen = WideCharToMultiByte( CP_ACP, 0, pszSource, -1, NULL, 0, NULL, NULL) ; hr = HRESULT_FROM_WIN32(GetLastError()) ; pszTmp = new CHAR[ nLen + 1 ] ; if (NULL == pszTmp) { hr = E_OUTOFMEMORY ; } if (S_OK == hr) { SetLastError(0) ; if (nLen != WideCharToMultiByte( CP_ACP, 0, pszSource, -1, pszTmp, nLen, NULL, NULL)) { hr = HRESULT_FROM_WIN32(GetLastError()) ; DH_ASSERT(S_OK == hr) ; } } if (S_OK == hr) { *ppszDest = pszTmp ; } else { if (NULL != pszTmp) { delete pszTmp ; } } return hr ; }