home *** CD-ROM | disk | FTP | other *** search
- // This is a part of the Microsoft Foundation Classes C++ library.
- // Copyright (C) 1992-1998 Microsoft Corporation
- // All rights reserved.
- //
- // This source code is only intended as a supplement to the
- // Microsoft Foundation Classes Reference and related
- // electronic documentation provided with the library.
- // See these sources for detailed information regarding the
- // Microsoft Foundation Classes product.
-
- #include "stdafx.h"
-
- #ifdef AFX_INIT_SEG
- #pragma code_seg(AFX_INIT_SEG)
- #endif
-
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
-
- #define new DEBUG_NEW
-
- /////////////////////////////////////////////////////////////////////////////
- // OLE UNICODE conversion support
-
- void AFXAPI AfxBSTR2CString(CString* pStr, BSTR bstr)
- {
- ASSERT(pStr != NULL);
- int nLen = SysStringLen(bstr);
- #if defined(_UNICODE) || defined(OLE2ANSI)
- LPTSTR lpsz = pStr->GetBufferSetLength(nLen);
- ASSERT(lpsz != NULL);
- memcpy(lpsz, bstr, nLen*sizeof(TCHAR));
- #else
- int nBytes = WideCharToMultiByte(CP_ACP, 0, bstr, nLen, NULL, NULL, NULL,
- NULL);
- LPSTR lpsz = pStr->GetBufferSetLength(nBytes);
- ASSERT(lpsz != NULL);
- WideCharToMultiByte(CP_ACP, 0, bstr, nLen, lpsz, nBytes, NULL, NULL);
- #endif
- }
-
- #if !defined(_UNICODE) && !defined(OLE2ANSI)
- // this function creates a BSTR but it actually has an ANSI string inside
- BSTR AFXAPI AfxBSTR2ABSTR(BSTR bstrW)
- {
- int nLen = SysStringLen(bstrW); //not including NULL
- int nBytes = WideCharToMultiByte(CP_ACP, 0, bstrW, nLen,
- NULL, NULL, NULL, NULL); //number of bytes not including NULL
- BSTR bstrA = SysAllocStringByteLen(NULL, nBytes); // allocates nBytes
- VERIFY(WideCharToMultiByte(CP_ACP, 0, bstrW, nLen, (LPSTR)bstrA, nBytes, NULL,
- NULL) == nBytes);
- return bstrA;
- }
-
- LPWSTR AFXAPI AfxTaskStringA2W(LPCSTR lpa)
- {
- LPWSTR lpw = AfxAllocTaskWideString(lpa);
- CoTaskMemFree((void*)lpa);
- return lpw;
- }
-
- LPSTR AFXAPI AfxTaskStringW2A(LPCWSTR lpw)
- {
- LPSTR lpa = AfxAllocTaskAnsiString(lpw);
- CoTaskMemFree((void*)lpw);
- return lpa;
- }
-
- LPDEVMODEW AFXAPI AfxDevModeA2W(LPDEVMODEW lpDevModeW, LPDEVMODEA lpDevModeA)
- {
- if (lpDevModeA == NULL)
- return NULL;
- ASSERT(lpDevModeW != NULL);
- AfxA2WHelper(lpDevModeW->dmDeviceName, (LPCSTR)lpDevModeA->dmDeviceName, 32*sizeof(WCHAR));
- memcpy(&lpDevModeW->dmSpecVersion, &lpDevModeA->dmSpecVersion,
- offsetof(DEVMODEW, dmFormName) - offsetof(DEVMODEW, dmSpecVersion));
- AfxA2WHelper(lpDevModeW->dmFormName, (LPCSTR)lpDevModeA->dmFormName, 32*sizeof(WCHAR));
- memcpy(&lpDevModeW->dmLogPixels, &lpDevModeA->dmLogPixels,
- sizeof(DEVMODEW) - offsetof(DEVMODEW, dmLogPixels));
- if (lpDevModeA->dmDriverExtra != 0)
- memcpy(lpDevModeW+1, lpDevModeA+1, lpDevModeA->dmDriverExtra);
- lpDevModeW->dmSize = sizeof(DEVMODEW);
- return lpDevModeW;
- }
-
- LPDEVMODEA AFXAPI AfxDevModeW2A(LPDEVMODEA lpDevModeA, LPDEVMODEW lpDevModeW)
- {
- if (lpDevModeW == NULL)
- return NULL;
- ASSERT(lpDevModeA != NULL);
- AfxW2AHelper((LPSTR)lpDevModeA->dmDeviceName, lpDevModeW->dmDeviceName, 32*sizeof(char));
- memcpy(&lpDevModeA->dmSpecVersion, &lpDevModeW->dmSpecVersion,
- offsetof(DEVMODEA, dmFormName) - offsetof(DEVMODEA, dmSpecVersion));
- AfxW2AHelper((LPSTR)lpDevModeA->dmFormName, lpDevModeW->dmFormName, 32*sizeof(char));
- memcpy(&lpDevModeA->dmLogPixels, &lpDevModeW->dmLogPixels,
- sizeof(DEVMODEA) - offsetof(DEVMODEA, dmLogPixels));
- if (lpDevModeW->dmDriverExtra != 0)
- memcpy(lpDevModeA+1, lpDevModeW+1, lpDevModeW->dmDriverExtra);
- lpDevModeA->dmSize = sizeof(DEVMODEA);
- return lpDevModeA;
- }
-
- LPTEXTMETRICW AFXAPI AfxTextMetricA2W(LPTEXTMETRICW lptmW, LPTEXTMETRICA lptmA)
- {
- if (lptmA == NULL)
- return NULL;
- ASSERT(lptmW != NULL);
- memcpy(lptmW, lptmA, sizeof(LONG) * 11);
- memcpy(&lptmW->tmItalic, &lptmA->tmItalic, sizeof(BYTE) * 5);
- MultiByteToWideChar(CP_ACP, 0, (LPCSTR)&lptmA->tmFirstChar, 1, &lptmW->tmFirstChar, 1);
- MultiByteToWideChar(CP_ACP, 0, (LPCSTR)&lptmA->tmLastChar, 1, &lptmW->tmLastChar, 1);
- MultiByteToWideChar(CP_ACP, 0, (LPCSTR)&lptmA->tmDefaultChar, 1, &lptmW->tmDefaultChar, 1);
- MultiByteToWideChar(CP_ACP, 0, (LPCSTR)&lptmA->tmBreakChar, 1, &lptmW->tmBreakChar, 1);
- return lptmW;
- }
-
- LPTEXTMETRICA AFXAPI AfxTextMetricW2A(LPTEXTMETRICA lptmA, LPTEXTMETRICW lptmW)
- {
- if (lptmW == NULL)
- return NULL;
- ASSERT(lptmA != NULL);
- memcpy(lptmA, lptmW, sizeof(LONG) * 11);
- memcpy(&lptmA->tmItalic, &lptmW->tmItalic, sizeof(BYTE) * 5);
- WideCharToMultiByte(CP_ACP, 0, &lptmW->tmFirstChar, 1, (LPSTR)&lptmA->tmFirstChar, 1, NULL, NULL);
- WideCharToMultiByte(CP_ACP, 0, &lptmW->tmLastChar, 1, (LPSTR)&lptmA->tmLastChar, 1, NULL, NULL);
- WideCharToMultiByte(CP_ACP, 0, &lptmW->tmDefaultChar, 1, (LPSTR)&lptmA->tmDefaultChar, 1, NULL, NULL);
- WideCharToMultiByte(CP_ACP, 0, &lptmW->tmBreakChar, 1, (LPSTR)&lptmA->tmBreakChar, 1, NULL, NULL);
- return lptmA;
- }
- #endif
-
- /////////////////////////////////////////////////////////////////////////////
- // OLE task memory allocation support
-
- LPWSTR AFXAPI AfxAllocTaskWideString(LPCWSTR lpszString)
- {
- if (lpszString == NULL)
- return NULL;
- UINT nSize = (wcslen(lpszString)+1) * sizeof(WCHAR);
- LPWSTR lpszResult = (LPWSTR)CoTaskMemAlloc(nSize);
- if (lpszResult != NULL)
- memcpy(lpszResult, lpszString, nSize);
- return lpszResult;
- }
-
- LPWSTR AFXAPI AfxAllocTaskWideString(LPCSTR lpszString)
- {
- if (lpszString == NULL)
- return NULL;
- UINT nLen = lstrlenA(lpszString)+1;
- LPWSTR lpszResult = (LPWSTR)CoTaskMemAlloc(nLen*sizeof(WCHAR));
- if (lpszResult != NULL)
- VERIFY(MultiByteToWideChar(CP_ACP, 0, lpszString, -1, lpszResult, nLen));
- return lpszResult;
- }
-
- LPSTR AFXAPI AfxAllocTaskAnsiString(LPCWSTR lpszString)
- {
- if (lpszString == NULL)
- return NULL;
- UINT nBytes = (wcslen(lpszString)+1)*2;
- LPSTR lpszResult = (LPSTR)CoTaskMemAlloc(nBytes);
- if (lpszResult != NULL)
- VERIFY(WideCharToMultiByte(CP_ACP, 0, lpszString, -1, lpszResult, nBytes, NULL, NULL));
- return lpszResult;
- }
-
- LPSTR AFXAPI AfxAllocTaskAnsiString(LPCSTR lpszString)
- {
- if (lpszString == NULL)
- return NULL;
- UINT nSize = lstrlenA(lpszString)+1;
- LPSTR lpszResult = (LPSTR)CoTaskMemAlloc(nSize);
- if (lpszResult != NULL)
- memcpy(lpszResult, lpszString, nSize);
- return lpszResult;
- }
-