//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1995. // // File: transhlp.cxx // // Contents: // // Classes: // // Functions: // // History: 12-05-95 JohannP (Johann Posch) Created // //---------------------------------------------------------------------------- #include HMODULE g_hLibMlang = NULL; //+--------------------------------------------------------------------------- // // Function: SzW2ADynamic // // Synopsis: Convert Unicode string wzFrom to Ansi, and return the Ansi string. // The Ansi string will be written into szTo (whose size is cchTo bytes) if // szTo is nonNull AND it is large enough to hold the Ansi string. // If this is not the case, the Ansi string is dynamically allocated. // If 'fTaskMalloc', allocation is done thru IMalloc, otherwise it is done // thru new. // // Arguments: [wzFrom] -- // [szTo] -- // [cchTo] -- // [fTaskMalloc] -- // // Returns: If error returns NULL, otherwise returns // pointer to Ansi string (if different from szTo, it must be freed via // delete or IMalloc, as appropriate). // // History: x-xx-xx Clarg Created // 2-25-96 JohannP (Johann Posch) Modified // // Notes: // //---------------------------------------------------------------------------- LPSTR SzW2ADynamic(LPCWSTR wzFrom, LPSTR szTo, int cchTo, BOOL fTaskMalloc) { int cchRequired; char *pszT = NULL; cchRequired = WideCharToMultiByte(CP_ACP, 0, wzFrom, -1, NULL, 0, NULL, NULL); cchRequired++; TransAssert((cchRequired > 0)); if (szTo && cchTo && (cchTo >= cchRequired)) { // szTo has enough space pszT = szTo; } else { // szTo is not large enough; dynamically allocate the buffer if (fTaskMalloc) { pszT = (char*)CoTaskMemAlloc(sizeof(char) * cchRequired); } else { pszT = new char[cchRequired]; } if (!pszT) { return NULL; } } if (!WideCharToMultiByte(CP_ACP, 0, wzFrom, -1, pszT, cchRequired, NULL, NULL)) { //TransAssert((0)); if (pszT != szTo) { (fTaskMalloc ? CoTaskMemFree(pszT) : delete pszT); } pszT = NULL; } return pszT; } //+--------------------------------------------------------------------------- // // Function: WzA2WDynamic // // Synopsis: Convert Ansi string szFrom to Unicode, and return the Unicode string. // The Unicode string will be written into wzTo (whose size is cwchTo bytes) // if wzTo is nonNull AND it is large enough to hold the Unicode string. // If this is not the case, the Unicode string is dynamically allocated. // If 'fTaskMalloc', allocation is done thru IMalloc, otherwise it is done // thru new. // // Arguments: [szFrom] -- // [wzTo] -- // [cwchTo] -- // [fTaskMalloc] -- // // Returns: If error returns NULL, otherwise returns // pointer to Unicode string (if different from wzTo, it must be freed via // delete or IMalloc, as appropriate). // // History: x-xx-xx Clarg Created // 2-25-96 JohannP (Johann Posch) modified // // Notes: // //---------------------------------------------------------------------------- LPWSTR WzA2WDynamic(LPCSTR szFrom, LPWSTR wzTo, int cwchTo, BOOL fTaskMalloc) { int cwchRequired; WCHAR *pwzT = NULL; cwchRequired = MultiByteToWideChar(CP_ACP, 0, szFrom, -1, NULL, 0); cwchRequired++; TransAssert((cwchRequired > 0)); if (wzTo && cwchTo && (cwchTo >= cwchRequired)) { // wzTo has enough space pwzT = wzTo; } else { // wzTo is not large enough; dynamically allocate the buffer if (fTaskMalloc) { pwzT = (WCHAR*)CoTaskMemAlloc(sizeof(WCHAR) * cwchRequired); } else { pwzT = new WCHAR[cwchRequired]; } if (!pwzT) { return NULL; } } if (!MultiByteToWideChar(CP_ACP, 0, szFrom, -1, pwzT, cwchRequired)) { //Assert(0); if (pwzT != wzTo) { (fTaskMalloc ? CoTaskMemFree(pwzT) : delete pwzT); } pwzT = NULL; } return pwzT; } //+--------------------------------------------------------------------------- // // Function: OLESTRDuplicate // // Synopsis: // // Arguments: [ws] -- // // Returns: // // History: 2-25-96 JohannP (Johann Posch) Created // // Notes: // //---------------------------------------------------------------------------- LPWSTR OLESTRDuplicate(LPCWSTR ws) { DWORD cLen; LPWSTR wsNew = NULL; if (ws) { wsNew = (LPWSTR) new WCHAR [wcslen(ws) + 1]; if (wsNew) { wcscpy(wsNew, ws); } } return wsNew; } //+------------------------------------------------------------------------- // // Function: WideCharToMultiByteWithMlang // // Synopsis: Convert Unicode string wzFrom to Ansi by uring MLANG, // // History: 5-29-97 DanpoZ (Danpo Zhang) Created // // Notes: // //-------------------------------------------------------------------------- void WideCharToMultiByteWithMlang( LPCWSTR lpwszWide, LPSTR lpszAnsi, int cchAnsi, DWORD dwCodePage) { INT cchOut; INT cchIn = wcslen(lpwszWide); HRESULT hr = NOERROR; typedef HRESULT (WINAPI * pfnMLANGW2A)( LPDWORD, DWORD, LPCWSTR, LPINT, LPSTR, LPINT); static pfnMLANGW2A pfnConvertINetUnicodeToMultiByte = NULL; if(!g_hLibMlang) { g_hLibMlang = LoadLibraryA("mlang.dll"); if(!g_hLibMlang) { goto End; } } if (!pfnConvertINetUnicodeToMultiByte) { pfnConvertINetUnicodeToMultiByte= (pfnMLANGW2A)GetProcAddress( g_hLibMlang, "ConvertINetUnicodeToMultiByte"); if (!pfnConvertINetUnicodeToMultiByte) { goto End; } } // first call to get the lenth of the Multi-Byte string hr = pfnConvertINetUnicodeToMultiByte( NULL, dwCodePage, lpwszWide, &cchIn, NULL, &cchOut); if( !FAILED(hr) && cchOut <= cchAnsi ) { hr = pfnConvertINetUnicodeToMultiByte( NULL, dwCodePage, lpwszWide, &cchIn, lpszAnsi, &cchOut); } End:; } DWORD StrLenMultiByteWithMlang( LPCWSTR lpwszWide, DWORD dwCodePage) { INT cchOut; INT cchIn = wcslen(lpwszWide); HRESULT hr = NOERROR; typedef HRESULT (WINAPI * pfnMLANGW2A)( LPDWORD, DWORD, LPCWSTR, LPINT, LPSTR, LPINT); static pfnMLANGW2A pfnConvertINetUnicodeToMultiByte = NULL; if(!g_hLibMlang) { g_hLibMlang = LoadLibraryA("mlang.dll"); if(!g_hLibMlang) { goto Error; } } if (!pfnConvertINetUnicodeToMultiByte) { pfnConvertINetUnicodeToMultiByte= (pfnMLANGW2A)GetProcAddress( g_hLibMlang, "ConvertINetUnicodeToMultiByte"); if (!pfnConvertINetUnicodeToMultiByte) { goto Error; } } // first call to get the lenth of the Multi-Byte string hr = pfnConvertINetUnicodeToMultiByte( NULL, dwCodePage, lpwszWide, &cchIn, NULL, &cchOut); if( !FAILED(hr) ) { return cchOut; } Error: return 0; }