//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1999 - 1999 // // File: string.cpp // // Contents: Utility functions for the CString class // // History: 10-Aug-99 VivekJ Created // //-------------------------------------------------------------------------- #include /*+-------------------------------------------------------------------------* * * LoadString * * PURPOSE: A function to load strings from the string module, not the AfxModule * * PARAMETERS: * CString & str : * UINT nID : * * RETURNS: * BOOL * *+-------------------------------------------------------------------------*/ BOOL LoadString(CString &str, UINT nID) { const size_t STRING_LEN_INCREMENT = 256; str.Empty(); // try fixed buffer first (to avoid wasting space in the heap) static TCHAR szTemp[STRING_LEN_INCREMENT]; int nLen = ::LoadString(GetStringModule(), nID, szTemp, countof(szTemp)); if (countof(szTemp) - nLen > 1) { szTemp[nLen] = 0; str = szTemp; return nLen > 0; } // try buffer size of 2*STRING_LEN_INCREMENT, then larger size until entire string is retrieved int nSize = STRING_LEN_INCREMENT; do { nSize += STRING_LEN_INCREMENT; nLen = ::LoadString(GetStringModule(), nID, str.GetBuffer(nSize-1), nSize); } while (nSize - nLen <= 1); str.ReleaseBuffer(); return (nLen > 0); } /*+-------------------------------------------------------------------------* * * FormatStrings * * PURPOSE: Similar to AfxFormatStrings, but uses GetStringModule() instead of * AfxGetModuleInstance. * * PARAMETERS: * CString& rString : * UINT nIDS : * LPCTSTR const : * int nString : * * RETURNS: * void * *+-------------------------------------------------------------------------*/ void FormatStrings(CString& rString, UINT nIDS, LPCTSTR const* rglpsz, int nString) { // empty the result (in case we fail) rString.Empty(); // get the format string. CString strFormat; if (!LoadString(strFormat, nIDS)) { TraceError(_T("FormatStrings"), SC(E_INVALIDARG)); return; // failed... } AfxFormatStrings(rString, strFormat, rglpsz, nString); } /*+-------------------------------------------------------------------------* * * FormatString1 * * PURPOSE: Similar to AfxFormatString1, but uses GetStringModule() instead * of AfxGetModuleInstance() * * PARAMETERS: * CString& rString : * UINT nIDS : * LPCTSTR lpsz1 : * * RETURNS: * void * *+-------------------------------------------------------------------------*/ void FormatString1(CString& rString, UINT nIDS, LPCTSTR lpsz1) { FormatStrings(rString, nIDS, &lpsz1, 1); } /*+-------------------------------------------------------------------------* * * FormatString2 * * PURPOSE: Similar to AfxFormatString2, but uses GetStringModule() instead * of AfxGetModuleInstance() * * PARAMETERS: * CString& rString : * UINT nIDS : * LPCTSTR lpsz1 : * LPCTSTR lpsz2 : * * RETURNS: * void * *+-------------------------------------------------------------------------*/ void FormatString2(CString& rString, UINT nIDS, LPCTSTR lpsz1, LPCTSTR lpsz2) { LPCTSTR rglpsz[2]; rglpsz[0] = lpsz1; rglpsz[1] = lpsz2; FormatStrings(rString, nIDS, rglpsz, 2); }