olecnvrt.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. // This is a part of the Microsoft Foundation Classes C++ library.
  2. // Copyright (C) 1992-1998 Microsoft Corporation
  3. // All rights reserved.
  4. //
  5. // This source code is only intended as a supplement to the
  6. // Microsoft Foundation Classes Reference and related
  7. // electronic documentation provided with the library.
  8. // See these sources for detailed information regarding the
  9. // Microsoft Foundation Classes product.
  10. #include "stdafx.h"
  11. #ifdef AFX_INIT_SEG
  12. #pragma code_seg(AFX_INIT_SEG)
  13. #endif
  14. #ifdef _DEBUG
  15. #undef THIS_FILE
  16. static char THIS_FILE[] = __FILE__;
  17. #endif
  18. #define new DEBUG_NEW
  19. /////////////////////////////////////////////////////////////////////////////
  20. // OLE UNICODE conversion support
  21. void AFXAPI AfxBSTR2CString(CString* pStr, BSTR bstr)
  22. {
  23. ASSERT(pStr != NULL);
  24. int nLen = SysStringLen(bstr);
  25. #if defined(_UNICODE) || defined(OLE2ANSI)
  26. LPTSTR lpsz = pStr->GetBufferSetLength(nLen);
  27. ASSERT(lpsz != NULL);
  28. memcpy(lpsz, bstr, nLen*sizeof(TCHAR));
  29. #else
  30. int nBytes = WideCharToMultiByte(CP_ACP, 0, bstr, nLen, NULL, NULL, NULL,
  31. NULL);
  32. LPSTR lpsz = pStr->GetBufferSetLength(nBytes);
  33. ASSERT(lpsz != NULL);
  34. WideCharToMultiByte(CP_ACP, 0, bstr, nLen, lpsz, nBytes, NULL, NULL);
  35. #endif
  36. }
  37. #if !defined(_UNICODE) && !defined(OLE2ANSI)
  38. // this function creates a BSTR but it actually has an ANSI string inside
  39. BSTR AFXAPI AfxBSTR2ABSTR(BSTR bstrW)
  40. {
  41. int nLen = SysStringLen(bstrW); //not including NULL
  42. int nBytes = WideCharToMultiByte(CP_ACP, 0, bstrW, nLen,
  43. NULL, NULL, NULL, NULL); //number of bytes not including NULL
  44. BSTR bstrA = SysAllocStringByteLen(NULL, nBytes); // allocates nBytes
  45. VERIFY(WideCharToMultiByte(CP_ACP, 0, bstrW, nLen, (LPSTR)bstrA, nBytes, NULL,
  46. NULL) == nBytes);
  47. return bstrA;
  48. }
  49. LPWSTR AFXAPI AfxTaskStringA2W(LPCSTR lpa)
  50. {
  51. LPWSTR lpw = AfxAllocTaskWideString(lpa);
  52. CoTaskMemFree((void*)lpa);
  53. return lpw;
  54. }
  55. LPSTR AFXAPI AfxTaskStringW2A(LPCWSTR lpw)
  56. {
  57. LPSTR lpa = AfxAllocTaskAnsiString(lpw);
  58. CoTaskMemFree((void*)lpw);
  59. return lpa;
  60. }
  61. LPDEVMODEW AFXAPI AfxDevModeA2W(LPDEVMODEW lpDevModeW, LPDEVMODEA lpDevModeA)
  62. {
  63. if (lpDevModeA == NULL)
  64. return NULL;
  65. ASSERT(lpDevModeW != NULL);
  66. AfxA2WHelper(lpDevModeW->dmDeviceName, (LPCSTR)lpDevModeA->dmDeviceName, 32*sizeof(WCHAR));
  67. memcpy(&lpDevModeW->dmSpecVersion, &lpDevModeA->dmSpecVersion,
  68. offsetof(DEVMODEW, dmFormName) - offsetof(DEVMODEW, dmSpecVersion));
  69. AfxA2WHelper(lpDevModeW->dmFormName, (LPCSTR)lpDevModeA->dmFormName, 32*sizeof(WCHAR));
  70. memcpy(&lpDevModeW->dmLogPixels, &lpDevModeA->dmLogPixels,
  71. sizeof(DEVMODEW) - offsetof(DEVMODEW, dmLogPixels));
  72. if (lpDevModeA->dmDriverExtra != 0)
  73. memcpy(lpDevModeW+1, lpDevModeA+1, lpDevModeA->dmDriverExtra);
  74. lpDevModeW->dmSize = sizeof(DEVMODEW);
  75. return lpDevModeW;
  76. }
  77. LPDEVMODEA AFXAPI AfxDevModeW2A(LPDEVMODEA lpDevModeA, LPDEVMODEW lpDevModeW)
  78. {
  79. if (lpDevModeW == NULL)
  80. return NULL;
  81. ASSERT(lpDevModeA != NULL);
  82. AfxW2AHelper((LPSTR)lpDevModeA->dmDeviceName, lpDevModeW->dmDeviceName, 32*sizeof(char));
  83. memcpy(&lpDevModeA->dmSpecVersion, &lpDevModeW->dmSpecVersion,
  84. offsetof(DEVMODEA, dmFormName) - offsetof(DEVMODEA, dmSpecVersion));
  85. AfxW2AHelper((LPSTR)lpDevModeA->dmFormName, lpDevModeW->dmFormName, 32*sizeof(char));
  86. memcpy(&lpDevModeA->dmLogPixels, &lpDevModeW->dmLogPixels,
  87. sizeof(DEVMODEA) - offsetof(DEVMODEA, dmLogPixels));
  88. if (lpDevModeW->dmDriverExtra != 0)
  89. memcpy(lpDevModeA+1, lpDevModeW+1, lpDevModeW->dmDriverExtra);
  90. lpDevModeA->dmSize = sizeof(DEVMODEA);
  91. return lpDevModeA;
  92. }
  93. LPTEXTMETRICW AFXAPI AfxTextMetricA2W(LPTEXTMETRICW lptmW, LPTEXTMETRICA lptmA)
  94. {
  95. if (lptmA == NULL)
  96. return NULL;
  97. ASSERT(lptmW != NULL);
  98. memcpy(lptmW, lptmA, sizeof(LONG) * 11);
  99. memcpy(&lptmW->tmItalic, &lptmA->tmItalic, sizeof(BYTE) * 5);
  100. MultiByteToWideChar(CP_ACP, 0, (LPCSTR)&lptmA->tmFirstChar, 1, &lptmW->tmFirstChar, 1);
  101. MultiByteToWideChar(CP_ACP, 0, (LPCSTR)&lptmA->tmLastChar, 1, &lptmW->tmLastChar, 1);
  102. MultiByteToWideChar(CP_ACP, 0, (LPCSTR)&lptmA->tmDefaultChar, 1, &lptmW->tmDefaultChar, 1);
  103. MultiByteToWideChar(CP_ACP, 0, (LPCSTR)&lptmA->tmBreakChar, 1, &lptmW->tmBreakChar, 1);
  104. return lptmW;
  105. }
  106. LPTEXTMETRICA AFXAPI AfxTextMetricW2A(LPTEXTMETRICA lptmA, LPTEXTMETRICW lptmW)
  107. {
  108. if (lptmW == NULL)
  109. return NULL;
  110. ASSERT(lptmA != NULL);
  111. memcpy(lptmA, lptmW, sizeof(LONG) * 11);
  112. memcpy(&lptmA->tmItalic, &lptmW->tmItalic, sizeof(BYTE) * 5);
  113. WideCharToMultiByte(CP_ACP, 0, &lptmW->tmFirstChar, 1, (LPSTR)&lptmA->tmFirstChar, 1, NULL, NULL);
  114. WideCharToMultiByte(CP_ACP, 0, &lptmW->tmLastChar, 1, (LPSTR)&lptmA->tmLastChar, 1, NULL, NULL);
  115. WideCharToMultiByte(CP_ACP, 0, &lptmW->tmDefaultChar, 1, (LPSTR)&lptmA->tmDefaultChar, 1, NULL, NULL);
  116. WideCharToMultiByte(CP_ACP, 0, &lptmW->tmBreakChar, 1, (LPSTR)&lptmA->tmBreakChar, 1, NULL, NULL);
  117. return lptmA;
  118. }
  119. #endif
  120. /////////////////////////////////////////////////////////////////////////////
  121. // OLE task memory allocation support
  122. LPWSTR AFXAPI AfxAllocTaskWideString(LPCWSTR lpszString)
  123. {
  124. if (lpszString == NULL)
  125. return NULL;
  126. UINT nSize = (wcslen(lpszString)+1) * sizeof(WCHAR);
  127. LPWSTR lpszResult = (LPWSTR)CoTaskMemAlloc(nSize);
  128. if (lpszResult != NULL)
  129. memcpy(lpszResult, lpszString, nSize);
  130. return lpszResult;
  131. }
  132. LPWSTR AFXAPI AfxAllocTaskWideString(LPCSTR lpszString)
  133. {
  134. if (lpszString == NULL)
  135. return NULL;
  136. UINT nLen = lstrlenA(lpszString)+1;
  137. LPWSTR lpszResult = (LPWSTR)CoTaskMemAlloc(nLen*sizeof(WCHAR));
  138. if (lpszResult != NULL)
  139. VERIFY(MultiByteToWideChar(CP_ACP, 0, lpszString, -1, lpszResult, nLen));
  140. return lpszResult;
  141. }
  142. LPSTR AFXAPI AfxAllocTaskAnsiString(LPCWSTR lpszString)
  143. {
  144. if (lpszString == NULL)
  145. return NULL;
  146. UINT nBytes = (wcslen(lpszString)+1)*2;
  147. LPSTR lpszResult = (LPSTR)CoTaskMemAlloc(nBytes);
  148. if (lpszResult != NULL)
  149. VERIFY(WideCharToMultiByte(CP_ACP, 0, lpszString, -1, lpszResult, nBytes, NULL, NULL));
  150. return lpszResult;
  151. }
  152. LPSTR AFXAPI AfxAllocTaskAnsiString(LPCSTR lpszString)
  153. {
  154. if (lpszString == NULL)
  155. return NULL;
  156. UINT nSize = lstrlenA(lpszString)+1;
  157. LPSTR lpszResult = (LPSTR)CoTaskMemAlloc(nSize);
  158. if (lpszResult != NULL)
  159. memcpy(lpszResult, lpszString, nSize);
  160. return lpszResult;
  161. }