ExtMfcSafeNativeTCHAR.h
上传用户:sesekoo
上传日期:2020-07-18
资源大小:21543k
文件大小:143k
源码类别:

界面编程

开发平台:

Visual C++

  1. }
  2. CExtSafeStringT & operator = ( const CExtSafeStringT & strSrc )
  3. {
  4. CThisSimpleString::operator = ( strSrc );
  5. return ( *this );
  6. }
  7. CExtSafeStringT & operator = ( const CThisSimpleString& strSrc )
  8. {
  9. CThisSimpleString::operator = ( strSrc );
  10. return ( *this );
  11. }
  12. CExtSafeStringT & operator = ( PCXSTR pszSrc )
  13. {
  14. CThisSimpleString::operator = ( pszSrc );
  15. return ( *this );
  16. }
  17. CExtSafeStringT & operator = ( PCYSTR pszSrc )
  18. {
  19. int nDestLength = (pszSrc != NULL) ? StringTraits::GetBaseTypeLength( pszSrc ) : 0;
  20. if( nDestLength > 0 )
  21. {
  22. PXSTR pszBuffer = GetBuffer( nDestLength );
  23. StringTraits::ConvertToBaseType( pszBuffer, nDestLength, pszSrc );
  24. ReleaseBufferSetLength( nDestLength );
  25. }
  26. else
  27. {
  28. Empty();
  29. }
  30. return ( *this );
  31. }
  32. CExtSafeStringT & operator = ( const unsigned char* pszSrc )
  33. {
  34. return ( operator = ( reinterpret_cast < const char * > ( pszSrc ) ) );
  35. }
  36. CExtSafeStringT & operator = ( char ch )
  37. {
  38. char ach[2] = { ch, 0 };
  39. return ( operator = ( ach ) );
  40. }
  41. CExtSafeStringT & operator = ( wchar_t ch )
  42. {
  43. wchar_t ach[2] = { ch, 0 };
  44. return ( operator = ( ach ) );
  45. }
  46. // CExtSafeStringT & operator = ( const VARIANT& var );
  47. CExtSafeStringT & operator += ( const CThisSimpleString& str )
  48. {
  49. CThisSimpleString::operator += ( str );
  50. return ( *this );
  51. }
  52. CExtSafeStringT & operator += ( PCXSTR pszSrc )
  53. {
  54. CThisSimpleString::operator += ( pszSrc );
  55. return ( *this );
  56. }
  57. template < int t_nSize >
  58. CExtSafeStringT & operator += ( const CStaticString < XCHAR, t_nSize > & strSrc )
  59. {
  60. CThisSimpleString::operator += ( strSrc );
  61. return ( *this );
  62. }
  63. CExtSafeStringT & operator += ( PCYSTR pszSrc )
  64. {
  65. CExtSafeStringT str( pszSrc, GetManager() );
  66. return ( operator += ( str ) );
  67. }
  68. CExtSafeStringT & operator += ( char ch )
  69. {
  70. CThisSimpleString::operator += ( ch );
  71. return ( *this );
  72. }
  73. CExtSafeStringT & operator += ( unsigned char ch )
  74. {
  75. CThisSimpleString::operator += ( ch );
  76. return ( *this );
  77. }
  78. CExtSafeStringT & operator += ( wchar_t ch )
  79. {
  80. CThisSimpleString::operator += ( ch );
  81. return ( *this );
  82. }
  83. // CExtSafeStringT & operator += ( const VARIANT& var );
  84. int Compare( PCXSTR psz ) const throw()
  85. {
  86. ATLASSERT( AtlIsValidString( ((LPCWSTR)psz) ) );
  87. return ( StringTraits::StringCompare( GetString(), psz ) );
  88. }
  89. int CompareNoCase( PCXSTR psz ) const throw()
  90. {
  91. ATLASSERT( AtlIsValidString( ((LPCWSTR)psz) ) );
  92. return ( StringTraits::StringCompareIgnore( GetString(), psz ) );
  93. }
  94. int Collate( PCXSTR psz ) const throw()
  95. {
  96. ATLASSERT( AtlIsValidString( ((LPCWSTR)psz) ) );
  97. return ( StringTraits::StringCollate( GetString(), psz ) );
  98. }
  99. int CollateNoCase( PCXSTR psz ) const throw()
  100. {
  101. ATLASSERT( AtlIsValidString( ((LPCWSTR)psz) ) );
  102. return ( StringTraits::StringCollateIgnore( GetString(), psz ) );
  103. }
  104. int Delete( int iIndex, int nCount = 1 )
  105. {
  106. ATLASSERT( iIndex >= 0 );
  107. ATLASSERT( nCount >= 0 );
  108. int nLength = GetLength();
  109. if( (nCount+iIndex) > nLength )
  110. {
  111. nCount = nLength-iIndex;
  112. }
  113. if( nCount > 0 )
  114. {
  115. int nNewLength = nLength-nCount;
  116. int nXCHARsToCopy = nLength-(iIndex+nCount)+1;
  117. PXSTR pszBuffer = GetBuffer();
  118. UINT nSizeInBytes = 
  119. nXCHARsToCopy * sizeof(XCHAR);
  120. __EXT_MFC_MEMMOVE(
  121. pszBuffer + iIndex, 
  122. nSizeInBytes,
  123. pszBuffer + iIndex + nCount, 
  124. nSizeInBytes 
  125. );
  126. ReleaseBufferSetLength( nNewLength );
  127. }
  128. return ( GetLength() );
  129. }
  130. int Insert( int iIndex, XCHAR ch )
  131. {
  132. ATLASSERT( iIndex >= 0 );
  133. if( iIndex > GetLength() )
  134. {
  135. iIndex = GetLength();
  136. }
  137. int nNewLength = GetLength()+1;
  138. PXSTR pszBuffer = GetBuffer( nNewLength );
  139. UINT nSizeInBytes = 
  140. ( nNewLength - iIndex ) * sizeof(XCHAR);
  141. __EXT_MFC_MEMMOVE(
  142. pszBuffer + iIndex + 1, 
  143. nSizeInBytes,
  144. pszBuffer + iIndex, 
  145. nSizeInBytes 
  146. );
  147. pszBuffer[iIndex] = ch;
  148. ReleaseBufferSetLength( nNewLength );
  149. return ( nNewLength );
  150. }
  151. int Insert( int iIndex, PCXSTR psz )
  152. {
  153. ATLASSERT( iIndex >= 0 );
  154. if( iIndex > GetLength() )
  155. {
  156. iIndex = GetLength();
  157. }
  158. int nInsertLength = StringTraits::SafeStringLen( psz );
  159. int nNewLength = GetLength();
  160. if( nInsertLength > 0 )
  161. {
  162. nNewLength += nInsertLength;
  163. PXSTR pszBuffer = GetBuffer( nNewLength );
  164. UINT nSizeInBytes = 
  165. ( nNewLength - iIndex - nInsertLength + 1 ) * sizeof(XCHAR);
  166. __EXT_MFC_MEMMOVE(
  167. pszBuffer + iIndex + nInsertLength,
  168. nSizeInBytes,
  169. pszBuffer + iIndex, 
  170. nSizeInBytes 
  171. );
  172. __EXT_MFC_MEMCPY(
  173. pszBuffer + iIndex, 
  174. nInsertLength * sizeof(XCHAR),
  175. psz, 
  176. nInsertLength * sizeof(XCHAR) 
  177. );
  178. ReleaseBufferSetLength( nNewLength );
  179. }
  180. return ( nNewLength );
  181. }
  182. int Replace( XCHAR chOld, XCHAR chNew )
  183. {
  184. int nCount = 0;
  185. if( chOld != chNew )
  186. {
  187. bool bCopied = false;
  188. PXSTR pszBuffer = const_cast < PXSTR > ( GetString() );
  189. int nLength = GetLength();
  190. int iChar = 0;
  191. while( iChar < nLength )
  192. {
  193. if( pszBuffer[iChar] == chOld )
  194. {
  195. if( !bCopied )
  196. {
  197. bCopied = true;
  198. pszBuffer = GetBuffer( nLength );
  199. }
  200. pszBuffer[iChar] = chNew;
  201. nCount++;
  202. }
  203. iChar = int( StringTraits::CharNext( pszBuffer+iChar )-pszBuffer );
  204. }
  205. if( bCopied )
  206. {
  207. ReleaseBufferSetLength( nLength );
  208. }
  209. }
  210. return ( nCount );
  211. }
  212. int Replace( PCXSTR pszOld, PCXSTR pszNew )
  213. {
  214. int nSourceLen = StringTraits::SafeStringLen( pszOld );
  215. if( nSourceLen == 0 )
  216. return ( 0 );
  217. int nReplacementLen = StringTraits::SafeStringLen( pszNew );
  218. int nCount = 0;
  219. {
  220. PCXSTR pszStart = GetString();
  221. PCXSTR pszEnd = pszStart+GetLength();
  222. while( pszStart < pszEnd )
  223. {
  224. PCXSTR pszTarget;
  225. while( (pszTarget = StringTraits::StringFindString( pszStart, pszOld ) ) != NULL)
  226. {
  227. nCount++;
  228. pszStart = pszTarget+nSourceLen;
  229. }
  230. pszStart += StringTraits::SafeStringLen( pszStart )+1;
  231. }
  232. }
  233. if( nCount > 0 )
  234. {
  235. int nOldLength = GetLength();
  236. int nNewLength = nOldLength+(nReplacementLen-nSourceLen)*nCount;
  237. PXSTR pszBuffer = GetBuffer( max( nNewLength, nOldLength ) );
  238. PXSTR pszStart = pszBuffer;
  239. PXSTR pszEnd = pszStart+nOldLength;
  240. while( pszStart < pszEnd )
  241. {
  242. PXSTR pszTarget;
  243. while( (pszTarget = StringTraits::StringFindString( pszStart, pszOld ) ) != NULL )
  244. {
  245. int nBalance = nOldLength-int(pszTarget-pszBuffer+nSourceLen);
  246. UINT nSizeInBytes = 
  247. nBalance * sizeof(XCHAR);
  248. __EXT_MFC_MEMMOVE(
  249. pszTarget + nReplacementLen, 
  250. nSizeInBytes,
  251. pszTarget + nSourceLen, 
  252. nSizeInBytes
  253. );
  254. __EXT_MFC_MEMCPY(
  255. pszTarget, 
  256. nReplacementLen * sizeof(XCHAR),
  257. pszNew, 
  258. nReplacementLen * sizeof(XCHAR) 
  259. );
  260. pszStart = pszTarget+nReplacementLen;
  261. pszTarget[nReplacementLen+nBalance] = 0;
  262. nOldLength += (nReplacementLen-nSourceLen);
  263. }
  264. pszStart += StringTraits::SafeStringLen( pszStart )+1;
  265. }
  266. ATLASSERT( pszBuffer[nNewLength] == 0 );
  267. ReleaseBufferSetLength( nNewLength );
  268. }
  269. return ( nCount );
  270. }
  271. int Remove( XCHAR chRemove )
  272. {
  273. int nLength = GetLength();
  274. PXSTR pszBuffer = GetBuffer( nLength );
  275. PXSTR pszSource = pszBuffer;
  276. PXSTR pszDest = pszBuffer;
  277. PXSTR pszEnd = pszBuffer+nLength;
  278. while( pszSource < pszEnd )
  279. {
  280. PXSTR pszNewSource = StringTraits::CharNext( pszSource );
  281. if( *pszSource != chRemove )
  282. {
  283. PXSTR pszNewDest = pszDest+(pszNewSource-pszSource);
  284. while( pszDest != pszNewDest )
  285. {
  286. *pszDest = *pszSource;
  287. pszSource++;
  288. pszDest++;
  289. }
  290. }
  291. pszSource = pszNewSource;
  292. }
  293. *pszDest = 0;
  294. int nCount = int( pszSource-pszDest );
  295. ReleaseBufferSetLength( nLength-nCount );
  296. return ( nCount );
  297. }
  298. CExtSafeStringT Tokenize( PCXSTR pszTokens, int& iStart ) const
  299. {
  300. ATLASSERT( iStart >= 0 );
  301. if( pszTokens == NULL )
  302. {
  303. return ( *this );
  304. }
  305. PCXSTR pszPlace = GetString()+iStart;
  306. PCXSTR pszEnd = GetString()+GetLength();
  307. if( pszPlace < pszEnd )
  308. {
  309. int nIncluding =
  310. StringTraits::StringSpanIncluding( pszPlace, pszTokens );
  311. if( (pszPlace+nIncluding) < pszEnd )
  312. {
  313. pszPlace += nIncluding;
  314. int nExcluding = StringTraits::StringSpanExcluding( pszPlace, pszTokens );
  315. int iFrom = iStart+nIncluding;
  316. int nUntil = nExcluding;
  317. iStart = iFrom+nUntil+1;
  318. return ( Mid( iFrom, nUntil ) );
  319. }
  320. }
  321. iStart = -1;
  322. return ( CExtSafeStringT( GetManager() ) );
  323. }
  324. int Find( XCHAR ch, int iStart = 0 ) const throw()
  325. {
  326. ATLASSERT( iStart >= 0 );
  327. int nLength = GetLength();
  328. if( iStart >= nLength)
  329. {
  330. return ( -1 );
  331. }
  332. PCXSTR psz = StringTraits::StringFindChar( GetString()+iStart, ch );
  333. return ( (psz == NULL) ? -1 : int( psz-GetString() ) );
  334. }
  335. int Find( PCXSTR pszSub, int iStart = 0 ) const throw()
  336. {
  337. ATLASSERT( iStart >= 0 );
  338. ATLASSERT( AtlIsValidString( ((LPCWSTR)pszSub) ) );
  339. int nLength = GetLength();
  340. if( iStart > nLength )
  341. {
  342. return ( -1 );
  343. }
  344. PCXSTR psz = StringTraits::StringFindString( GetString()+iStart, pszSub );
  345. return ( (psz == NULL) ? -1 : int( psz-GetString() ) );
  346. }
  347. int FindOneOf( PCXSTR pszCharSet ) const throw()
  348. {
  349. ATLASSERT( AtlIsValidString( ((LPCWSTR)pszCharSet) ) );
  350. PCXSTR psz = StringTraits::StringScanSet( GetString(), pszCharSet );
  351. return ( (psz == NULL) ? -1 : int( psz-GetString() ) );
  352. }
  353. int ReverseFind( XCHAR ch ) const throw()
  354. {
  355. PCXSTR psz = StringTraits::StringFindCharRev( GetString(), ch );
  356. return ( (psz == NULL) ? -1 : int( psz-GetString() ) );
  357. }
  358. CExtSafeStringT & MakeUpper()
  359. {
  360. int nLength = GetLength();
  361. PXSTR pszBuffer = GetBuffer( nLength );
  362. StringTraits::StringUppercase( pszBuffer );
  363. ReleaseBufferSetLength( nLength );
  364. return ( *this );
  365. }
  366. CExtSafeStringT & MakeLower()
  367. {
  368. int nLength = GetLength();
  369. PXSTR pszBuffer = GetBuffer( nLength );
  370. StringTraits::StringLowercase( pszBuffer );
  371. ReleaseBufferSetLength( nLength );
  372. return ( *this );
  373. }
  374. CExtSafeStringT & MakeReverse()
  375. {
  376. int nLength = GetLength();
  377. PXSTR pszBuffer = GetBuffer( nLength );
  378. StringTraits::StringReverse( pszBuffer );
  379. ReleaseBufferSetLength( nLength );
  380. return ( *this );
  381. }
  382. CExtSafeStringT & TrimRight()
  383. {
  384. PCXSTR psz = GetString();
  385. PCXSTR pszLast = NULL;
  386. while( *psz != 0 )
  387. {
  388. if( StringTraits::IsSpace( *psz ) )
  389. {
  390. if( pszLast == NULL )
  391. pszLast = psz;
  392. }
  393. else
  394. {
  395. pszLast = NULL;
  396. }
  397. psz = StringTraits::CharNext( psz );
  398. }
  399. if( pszLast != NULL )
  400. {
  401. int iLast = int( pszLast-GetString() );
  402. Truncate( iLast );
  403. }
  404. return ( *this );
  405. }
  406. CExtSafeStringT & TrimLeft()
  407. {
  408. PCXSTR psz = GetString();
  409. while( StringTraits::IsSpace( *psz ) )
  410. {
  411. psz = StringTraits::CharNext( psz );
  412. }
  413. if( psz != GetString() )
  414. {
  415. int iFirst = int( psz-GetString() );
  416. PXSTR pszBuffer = GetBuffer( GetLength() );
  417. psz = pszBuffer+iFirst;
  418. int nDataLength = GetLength()-iFirst;
  419. UINT nSizeInBytes = 
  420. ( nDataLength + 1 ) * sizeof(XCHAR);
  421. __EXT_MFC_MEMMOVE(
  422. pszBuffer,
  423. nSizeInBytes,
  424. psz, 
  425. nSizeInBytes
  426. );
  427. ReleaseBufferSetLength( nDataLength );
  428. }
  429. return ( *this );
  430. }
  431. CExtSafeStringT & Trim()
  432. {
  433. return ( TrimRight().TrimLeft() );
  434. }
  435. CExtSafeStringT & Trim( XCHAR chTarget )
  436. {
  437. return ( TrimRight( chTarget ).TrimLeft( chTarget ) );
  438. }
  439. CExtSafeStringT & Trim( PCXSTR pszTargets )
  440. {
  441. return ( TrimRight( pszTargets ).TrimLeft( pszTargets ) );
  442. }
  443. CExtSafeStringT & TrimRight( XCHAR chTarget )
  444. {
  445. PCXSTR psz = GetString();
  446. PCXSTR pszLast = NULL;
  447. while( *psz != 0 )
  448. {
  449. if( *psz == chTarget )
  450. {
  451. if( pszLast == NULL )
  452. {
  453. pszLast = psz;
  454. }
  455. }
  456. else
  457. {
  458. pszLast = NULL;
  459. }
  460. psz = StringTraits::CharNext( psz );
  461. }
  462. if( pszLast != NULL )
  463. {
  464. int iLast = int( pszLast-GetString() );
  465. Truncate( iLast );
  466. }
  467. return ( *this );
  468. }
  469. CExtSafeStringT & TrimRight( PCXSTR pszTargets )
  470. {
  471. if( (pszTargets == NULL) || (*pszTargets == 0) )
  472. {
  473. return ( *this );
  474. }
  475. PCXSTR psz = GetString();
  476. PCXSTR pszLast = NULL;
  477. while( *psz != 0 )
  478. {
  479. if( StringTraits::StringFindChar( pszTargets, *psz ) != NULL )
  480. {
  481. if( pszLast == NULL )
  482. {
  483. pszLast = psz;
  484. }
  485. }
  486. else
  487. {
  488. pszLast = NULL;
  489. }
  490. psz = StringTraits::CharNext( psz );
  491. }
  492. if( pszLast != NULL )
  493. {
  494. int iLast = int( pszLast-GetString() );
  495. Truncate( iLast );
  496. }
  497. return ( *this );
  498. }
  499. CExtSafeStringT & TrimLeft( XCHAR chTarget )
  500. {
  501. PCXSTR psz = GetString();
  502. while( chTarget == *psz )
  503. {
  504. psz = StringTraits::CharNext( psz );
  505. }
  506. if( psz != GetString() )
  507. {
  508. int iFirst = int( psz-GetString() );
  509. PXSTR pszBuffer = GetBuffer( GetLength() );
  510. psz = pszBuffer+iFirst;
  511. int nDataLength = GetLength()-iFirst;
  512. UINT nSizeInBytes = 
  513. ( nDataLength + 1 ) * sizeof(XCHAR);
  514. __EXT_MFC_MEMMOVE(
  515. pszBuffer,
  516. nSizeInBytes,
  517. psz, 
  518. nSizeInBytes
  519. );
  520. ReleaseBufferSetLength( nDataLength );
  521. }
  522. return ( *this );
  523. }
  524. CExtSafeStringT & TrimLeft( PCXSTR pszTargets )
  525. {
  526. if( (pszTargets == NULL) || (*pszTargets == 0) )
  527. {
  528. return ( *this );
  529. }
  530. PCXSTR psz = GetString();
  531. while( (*psz != 0) && (StringTraits::StringFindChar( pszTargets, *psz ) != NULL) )
  532. {
  533. psz = StringTraits::CharNext( psz );
  534. }
  535. if( psz != GetString() )
  536. {
  537. int iFirst = int( psz-GetString() );
  538. PXSTR pszBuffer = GetBuffer( GetLength() );
  539. psz = pszBuffer+iFirst;
  540. int nDataLength = GetLength()-iFirst;
  541. UINT nSizeInBytes = 
  542. ( nDataLength + 1 ) * sizeof(XCHAR);
  543. __EXT_MFC_MEMMOVE(
  544. pszBuffer,
  545. nSizeInBytes,
  546. psz, 
  547. nSizeInBytes
  548. );
  549. ReleaseBufferSetLength( nDataLength );
  550. }
  551. return ( *this );
  552. }
  553. __if_exists( StringTraits::ConvertToOem )
  554. {
  555. void AnsiToOem()
  556. {
  557. int nLength = GetLength();
  558. PXSTR pszBuffer = GetBuffer( nLength );
  559. StringTraits::ConvertToOem( pszBuffer );
  560. ReleaseBufferSetLength( nLength );
  561. }
  562. }
  563. __if_exists( StringTraits::ConvertToAnsi )
  564. {
  565. void OemToAnsi()
  566. {
  567. int nLength = GetLength();
  568. PXSTR pszBuffer = GetBuffer( nLength );
  569. StringTraits::ConvertToAnsi( pszBuffer );
  570. ReleaseBufferSetLength( nLength );
  571. }
  572. }
  573. CExtSafeStringT Mid( int iFirst ) const
  574. {
  575. return ( Mid( iFirst, GetLength()-iFirst ) );
  576. }
  577. CExtSafeStringT Mid( int iFirst, int nCount ) const
  578. {
  579. ATLASSERT( iFirst >= 0 );
  580. ATLASSERT( nCount >= 0 );
  581. if( (iFirst+nCount) > GetLength() )
  582. {
  583. nCount = GetLength()-iFirst;
  584. }
  585. if( iFirst > GetLength() )
  586. {
  587. nCount = 0;
  588. }
  589. ATLASSERT( (nCount == 0) || ((iFirst+nCount) <= GetLength()) );
  590. if( (iFirst == 0) && ((iFirst+nCount) == GetLength()) )
  591. {
  592. return ( *this );
  593. }
  594. return ( CExtSafeStringT( GetString()+iFirst, nCount, GetManager() ) );
  595. }
  596. CExtSafeStringT Right( int nCount ) const
  597. {
  598. ATLASSERT( nCount >= 0 );
  599. int nLength = GetLength();
  600. if( nCount >= nLength )
  601. {
  602. return ( *this );
  603. }
  604. return ( CExtSafeStringT( GetString()+nLength-nCount, nCount, GetManager() ) );
  605. }
  606. CExtSafeStringT Left( int nCount ) const
  607. {
  608. ATLASSERT( nCount >= 0 );
  609. int nLength = GetLength();
  610. if( nCount >= nLength )
  611. {
  612. return ( *this );
  613. }
  614. return ( CExtSafeStringT( GetString(), nCount, GetManager() ) );
  615. }
  616. CExtSafeStringT SpanIncluding( PCXSTR pszCharSet ) const
  617. {
  618. ATLASSERT( AtlIsValidString( ((LPCWSTR)pszCharSet) ) );
  619. return ( Left( StringTraits::StringSpanIncluding( GetString(), pszCharSet ) ) );
  620. }
  621. CExtSafeStringT SpanExcluding( PCXSTR pszCharSet ) const
  622. {
  623. ATLASSERT( AtlIsValidString( ((LPCWSTR)pszCharSet) ) );
  624. return ( Left( StringTraits::StringSpanExcluding( GetString(), pszCharSet ) ) );
  625.   }
  626. void __cdecl Format( PCXSTR pszFormat, ... )
  627. {
  628. ATLASSERT( AtlIsValidString( ((LPCWSTR)pszFormat) ) );
  629. va_list argList;
  630. va_start( argList, pszFormat );
  631. FormatV( pszFormat, argList );
  632. va_end( argList );
  633. }
  634. void __cdecl Format( UINT nFormatID, ... )
  635. {
  636. CExtSafeStringT strFormat( GetManager() );
  637. ATLVERIFY( strFormat.LoadString( nFormatID ) );
  638. va_list argList;
  639. va_start( argList, nFormatID );
  640. FormatV( strFormat, argList );
  641. va_end( argList );
  642. }
  643. void __cdecl AppendFormat( UINT nFormatID, ... )
  644. {
  645. va_list argList;
  646. va_start( argList, nFormatID );
  647. CExtSafeStringT strFormat( GetManager() );
  648. ATLVERIFY( strFormat.LoadString( nFormatID ) ); 
  649. AppendFormatV( strFormat, argList );
  650. va_end( argList );
  651. }
  652. void __cdecl AppendFormat( PCXSTR pszFormat, ... )
  653. {
  654. ATLASSERT( AtlIsValidString( ((LPCWSTR)pszFormat) ) );
  655. va_list argList;
  656. va_start( argList, pszFormat );
  657. AppendFormatV( pszFormat, argList );
  658. va_end( argList );
  659. }
  660. void AppendFormatV( PCXSTR pszFormat, va_list args )
  661. {
  662. ATLASSERT( AtlIsValidString( ((LPCWSTR)pszFormat) ) );
  663. int nCurrentLength = GetLength();
  664. int nAppendLength = StringTraits::GetFormattedLength( pszFormat, args );
  665. PXSTR pszBuffer = GetBuffer( nCurrentLength+nAppendLength );
  666. StringTraits::Format( pszBuffer+nCurrentLength, pszFormat, args );
  667. ReleaseBufferSetLength( nCurrentLength+nAppendLength );
  668. }
  669. void FormatV( PCXSTR pszFormat, va_list args )
  670. {
  671. ATLASSERT( AtlIsValidString( ((LPCWSTR)pszFormat) ) );
  672. int nLength = StringTraits::GetFormattedLength( pszFormat, args );
  673. PXSTR pszBuffer = GetBuffer( nLength );
  674. StringTraits::Format( pszBuffer, pszFormat, args );
  675. ReleaseBufferSetLength( nLength );
  676. }
  677. __if_exists(StringTraits::FormatMessage)
  678. {
  679. void __cdecl FormatMessage( PCXSTR pszFormat, ... )
  680. {
  681. va_list argList;
  682. va_start( argList, pszFormat );
  683. FormatMessageV( pszFormat, &argList );
  684. va_end( argList );
  685. }
  686. void __cdecl FormatMessage( UINT nFormatID, ... )
  687. {
  688. CExtSafeStringT strFormat( GetManager() );
  689. ATLVERIFY( strFormat.LoadString( nFormatID ) );
  690. va_list argList;
  691. va_start( argList, nFormatID );
  692. FormatMessageV( strFormat, &argList );
  693. va_end( argList );
  694. }
  695. }
  696. BSTR AllocSysString() const
  697. {
  698. BSTR bstrResult = StringTraits::AllocSysString( GetString(), 
  699. GetLength() );
  700. if( bstrResult == NULL )
  701. {
  702. ThrowMemoryException();
  703. }
  704. return ( bstrResult );
  705. }
  706. BSTR SetSysString( BSTR* pbstr ) const
  707. {
  708. ATLASSERT( AtlIsValidAddress( pbstr, sizeof(BSTR) ) );
  709. if( !StringTraits::ReAllocSysString( GetString(), pbstr,
  710. GetLength() ) )
  711. {
  712. ThrowMemoryException();
  713. }
  714. ATLASSERT( *pbstr != NULL );
  715. return ( *pbstr );
  716. }
  717. BOOL GetEnvironmentVariable( PCXSTR pszVar )
  718. {
  719. ULONG nLength = StringTraits::GetEnvironmentVariable( pszVar, NULL, 0 );
  720. BOOL bRetVal = FALSE;
  721. if( nLength == 0 )
  722. {
  723. Empty();
  724. }
  725. else
  726. {
  727. PXSTR pszBuffer = GetBuffer( nLength );
  728. StringTraits::GetEnvironmentVariable( pszVar, pszBuffer, nLength );
  729. ReleaseBuffer();
  730. bRetVal = TRUE;
  731. }
  732. return ( bRetVal );
  733. }
  734. BOOL LoadString( UINT nID )
  735. {
  736. HINSTANCE hInst = StringTraits::FindStringResourceInstance( nID );
  737. if( hInst == NULL )
  738. {
  739. return ( FALSE );
  740. }
  741. return ( LoadString( hInst, nID ) );
  742. }
  743. BOOL LoadString( HINSTANCE hInstance, UINT nID )
  744. {
  745. const ATLSTRINGRESOURCEIMAGE* pImage = AtlGetStringResourceImage( hInstance, nID );
  746. if( pImage == NULL )
  747. {
  748. return ( FALSE );
  749. }
  750. int nLength = StringTraits::GetBaseTypeLength(
  751. (PCXSTR)pImage->achString,
  752. pImage->nLength
  753. );
  754. PXSTR pszBuffer = GetBuffer( nLength );
  755. StringTraits::ConvertToBaseType(
  756. pszBuffer,
  757. nLength,
  758. (PCXSTR)pImage->achString,
  759. pImage->nLength
  760. );
  761. ReleaseBufferSetLength( nLength );
  762. return ( TRUE );
  763. }
  764. BOOL LoadString( HINSTANCE hInstance, UINT nID, WORD wLanguageID )
  765. {
  766. const ATLSTRINGRESOURCEIMAGE* pImage = AtlGetStringResourceImage( hInstance, nID, wLanguageID );
  767. if( pImage == NULL )
  768. {
  769. return ( FALSE );
  770. }
  771. int nLength = StringTraits::GetBaseTypeLength( pImage->achString, pImage->nLength );
  772. PXSTR pszBuffer = GetBuffer( nLength );
  773. StringTraits::ConvertToBaseType(
  774. pszBuffer,
  775. nLength,
  776. (StringTraits::PCXSTR)pImage->achString,
  777. pImage->nLength
  778. );
  779. ReleaseBufferSetLength( nLength );
  780. return ( TRUE );
  781. }
  782. friend CExtSafeStringT operator + ( const CExtSafeStringT & str1, const CExtSafeStringT & str2 )
  783. {
  784. CExtSafeStringT strResult( str1.GetManager() );
  785. Concatenate( strResult, str1, str1.GetLength(), str2, str2.GetLength() );
  786. return ( strResult );
  787. }
  788. friend CExtSafeStringT operator + ( const CExtSafeStringT & str1, PCXSTR psz2 )
  789. {
  790. CExtSafeStringT strResult( str1.GetManager() );
  791. Concatenate( strResult, str1, str1.GetLength(), psz2, StringLength( psz2 ) );
  792. return ( strResult );
  793. }
  794. friend CExtSafeStringT operator + ( PCXSTR psz1, const CExtSafeStringT & str2 )
  795. {
  796. CExtSafeStringT strResult( str2.GetManager() );
  797. Concatenate( strResult, psz1, StringLength( psz1 ), str2, str2.GetLength() );
  798. return ( strResult );
  799. }
  800. friend CExtSafeStringT operator + ( const CExtSafeStringT & str1, wchar_t ch2 )
  801. {
  802. CExtSafeStringT strResult( str1.GetManager() );
  803. XCHAR chTemp = XCHAR( ch2 );
  804. Concatenate( strResult, str1, str1.GetLength(), &chTemp, 1 );
  805. return ( strResult );
  806. }
  807. friend CExtSafeStringT operator + ( const CExtSafeStringT & str1, char ch2 )
  808. {
  809. CExtSafeStringT strResult( str1.GetManager() );
  810. XCHAR chTemp = XCHAR( ch2 );
  811. Concatenate( strResult, str1, str1.GetLength(), &chTemp, 1 );
  812. return ( strResult );
  813. }
  814. friend CExtSafeStringT operator + ( wchar_t ch1, const CExtSafeStringT & str2 )
  815. {
  816. CExtSafeStringT strResult( str2.GetManager() );
  817. XCHAR chTemp = XCHAR( ch1 );
  818. Concatenate( strResult, &chTemp, 1, str2, str2.GetLength() );
  819. return ( strResult );
  820. }
  821. friend CExtSafeStringT operator + ( char ch1, const CExtSafeStringT & str2 )
  822. {
  823. CExtSafeStringT strResult( str2.GetManager() );
  824. XCHAR chTemp = XCHAR( ch1 );
  825. Concatenate( strResult, &chTemp, 1, str2, str2.GetLength() );
  826. return ( strResult );
  827. }
  828. friend bool operator == ( const CExtSafeStringT & str1, const CExtSafeStringT & str2 ) throw()
  829. {
  830. return ( str1.Compare( str2 ) == 0 );
  831. }
  832. friend bool operator == (
  833. const CExtSafeStringT & str1, PCXSTR psz2 ) throw()
  834. {
  835. return ( str1.Compare( psz2 ) == 0 );
  836. }
  837. friend bool operator == (
  838. PCXSTR psz1, const CExtSafeStringT & str2 ) throw()
  839. {
  840. return ( str2.Compare( psz1 ) == 0 );
  841. }
  842. friend bool operator == (
  843. const CExtSafeStringT & str1, PCYSTR psz2 ) throw( ... )
  844. {
  845. CExtSafeStringT str2( psz2, str1.GetManager() );
  846. return ( str1 == str2 );
  847. }
  848. friend bool operator == (
  849. PCYSTR psz1, const CExtSafeStringT & str2 ) throw( ... )
  850. {
  851. CExtSafeStringT str1( psz1, str2.GetManager() );
  852. return ( str1 == str2 );
  853. }
  854. friend bool operator != (
  855. const CExtSafeStringT & str1, const CExtSafeStringT & str2 ) throw()
  856. {
  857. return ( str1.Compare( str2 ) != 0 );
  858. }
  859. friend bool operator != (
  860. const CExtSafeStringT & str1, PCXSTR psz2 ) throw()
  861. {
  862. return ( str1.Compare( psz2 ) != 0 );
  863. }
  864. friend bool operator != (
  865. PCXSTR psz1, const CExtSafeStringT & str2 ) throw()
  866. {
  867. return ( str2.Compare( psz1 ) != 0 );
  868. }
  869. friend bool operator != (
  870. const CExtSafeStringT & str1, PCYSTR psz2 ) throw( ... )
  871. {
  872. CExtSafeStringT str2( psz2, str1.GetManager() );
  873. return ( str1 != str2 );
  874. }
  875. friend bool operator != (
  876. PCYSTR psz1, const CExtSafeStringT & str2 ) throw( ... )
  877. {
  878. CExtSafeStringT str1( psz1, str2.GetManager() );
  879. return ( str1 != str2 );
  880. }
  881. friend bool operator < ( const CExtSafeStringT & str1, const CExtSafeStringT & str2 ) throw()
  882. {
  883. return ( str1.Compare( str2 ) < 0 );
  884. }
  885. friend bool operator < ( const CExtSafeStringT & str1, PCXSTR psz2 ) throw()
  886. {
  887. return ( str1.Compare( psz2 ) < 0 );
  888. }
  889. friend bool operator < ( PCXSTR psz1, const CExtSafeStringT & str2 ) throw()
  890. {
  891. return ( str2.Compare( psz1 ) >= 0 );
  892. }
  893. friend bool operator > ( const CExtSafeStringT & str1, const CExtSafeStringT & str2 ) throw()
  894. {
  895. return ( str1.Compare( str2 ) > 0 );
  896. }
  897. friend bool operator > ( const CExtSafeStringT & str1, PCXSTR psz2 ) throw()
  898. {
  899. return ( str1.Compare( psz2 ) > 0 );
  900. }
  901. friend bool operator > ( PCXSTR psz1, const CExtSafeStringT & str2 ) throw()
  902. {
  903. return ( str2.Compare( psz1 ) <= 0 );
  904. }
  905. friend bool operator <= ( const CExtSafeStringT & str1, const CExtSafeStringT & str2 ) throw()
  906. {
  907. return ( str1.Compare( str2 ) <= 0 );
  908. }
  909. friend bool operator <= ( const CExtSafeStringT & str1, PCXSTR psz2 ) throw()
  910. {
  911. return ( str1.Compare( psz2 ) <= 0 );
  912. }
  913. friend bool operator <= ( PCXSTR psz1, const CExtSafeStringT & str2 ) throw()
  914. {
  915. return ( str2.Compare( psz1 ) > 0 );
  916. }
  917. friend bool operator >= ( const CExtSafeStringT & str1, const CExtSafeStringT & str2 ) throw()
  918. {
  919. return ( str1.Compare( str2 ) >= 0 );
  920. }
  921. friend bool operator >= ( const CExtSafeStringT & str1, PCXSTR psz2 ) throw()
  922. {
  923. return ( str1.Compare( psz2 ) >= 0 );
  924. }
  925. friend bool operator >= ( PCXSTR psz1, const CExtSafeStringT & str2 ) throw()
  926. {
  927. return ( str2.Compare( psz1 ) < 0 );
  928. }
  929. friend bool operator == ( XCHAR ch1, const CExtSafeStringT & str2 ) throw()
  930. {
  931. return ( (str2.GetLength() == 1) && (str2[0] == ch1) );
  932. }
  933. friend bool operator == ( const CExtSafeStringT & str1, XCHAR ch2 ) throw()
  934. {
  935. return ( (str1.GetLength() == 1) && (str1[0] == ch2) );
  936. }
  937. friend bool operator != ( XCHAR ch1, const CExtSafeStringT & str2 ) throw()
  938. {
  939. return ( (str2.GetLength() != 1) || (str2[0] != ch1) );
  940. }
  941. friend bool operator != ( const CExtSafeStringT & str1, XCHAR ch2 ) throw()
  942. {
  943. return ( (str1.GetLength() != 1) || (str1[0] != ch2) );
  944. }
  945. private:
  946. bool CheckImplicitLoad( const void* pv )
  947. {
  948. bool bRet = false;
  949. if( (pv != NULL) && IS_INTRESOURCE( pv ) )
  950. {
  951. UINT nID = LOWORD( reinterpret_cast < DWORD_PTR > ( pv ) );
  952. if( !LoadString( nID ) )
  953. {
  954. ATLTRACE( atlTraceString, 2, _T( "Warning: implicit LoadString(%u) failedn" ), nID );
  955. }
  956. bRet = true;
  957. }
  958. return ( bRet );
  959. }
  960. __if_exists( StringTraits::FormatMessage )
  961. {
  962. void FormatMessageV( PCXSTR pszFormat, va_list* pArgList )
  963. {
  964. CHeapPtr< XCHAR, CLocalAllocator > pszTemp;
  965. DWORD dwResult = StringTraits::FormatMessage( FORMAT_MESSAGE_FROM_STRING|
  966. FORMAT_MESSAGE_ALLOCATE_BUFFER, pszFormat, 0, 0, reinterpret_cast < PXSTR > ( &pszTemp ),
  967. 0, pArgList );
  968. if( dwResult == 0 )
  969. {
  970. ThrowMemoryException();
  971. }
  972. *this = pszTemp;
  973. }
  974. }
  975. }; // class CExtSafeStringT
  976. template < typename BaseType, class StringTraits >
  977. inline
  978. CArchive & operator << (
  979. CArchive& ar,
  980. const CExtSafeStringT < BaseType, StringTraits > & str
  981. )
  982. {
  983. AfxWriteStringLength(
  984. ar,
  985. str.GetLength(),
  986. sizeof(BaseType) == sizeof(wchar_t)
  987. );
  988. ar.Write(
  989. str,
  990. str.GetLength() * sizeof(BaseType)
  991. );
  992. return ar;
  993. }
  994. template < typename BaseType, class StringTraits >
  995. inline
  996. CArchive & operator >> (
  997. CArchive& ar,
  998. CExtSafeStringT < BaseType, StringTraits > & str
  999. )
  1000. {
  1001. int nCharSize;
  1002. UINT nLength = UINT( AfxReadStringLength( ar, nCharSize ) );
  1003. if( nCharSize == sizeof(char) )
  1004. {
  1005. ATL::CTempBuffer < char > pszBufferA( nLength + 1 );
  1006. pszBufferA[ nLength ] = '';
  1007. UINT nBytesRead =
  1008. ar.Read(
  1009. pszBufferA,
  1010. nLength * sizeof(char)
  1011. );
  1012. if( nBytesRead != ( nLength * sizeof(char) ) )
  1013. AfxThrowArchiveException( CArchiveException::endOfFile );
  1014. str = pszBufferA;
  1015. }
  1016. else
  1017. {
  1018. ASSERT( nCharSize == sizeof(wchar_t) );
  1019. ATL::CTempBuffer< wchar_t > pszBufferW( nLength+1 );
  1020. pszBufferW[ nLength ] = L'';
  1021. UINT nBytesRead =
  1022. ar.Read(
  1023. pszBufferW,
  1024. nLength * sizeof(wchar_t)
  1025. );
  1026. if( nBytesRead != ( nLength * sizeof(wchar_t) ) )
  1027. AfxThrowArchiveException( CArchiveException::endOfFile );
  1028. str = (BaseType *)(wchar_t *)pszBufferW;
  1029. }
  1030. return ar;
  1031. }
  1032. typedef
  1033. CExtSafeStrTraitMFC <
  1034. __prof_uis_used_wchar_t,
  1035. CExtSafeChTraitsCRT< __prof_uis_used_wchar_t >
  1036. >
  1037. __prof_uis_used_StrTraitMFC;
  1038. typedef
  1039. CExtSafeStringT <
  1040. __prof_uis_used_wchar_t,
  1041. __prof_uis_used_StrTraitMFC
  1042. >
  1043. __prof_uis_used_CStringT;
  1044. typedef
  1045. CExtSafeStrTraitMFC <
  1046. __prof_uis_converted_wchar_t,
  1047. CExtSafeChTraitsCRT< __prof_uis_used_wchar_t >
  1048. >
  1049. __prof_uis_converted_StrTraitMFC;
  1050. typedef
  1051. CExtSafeStringT <
  1052. __prof_uis_converted_wchar_t,
  1053. __prof_uis_converted_StrTraitMFC
  1054. >
  1055. __prof_uis_converted_CStringT;
  1056. #if (defined _MSC_EXTENSIONS)
  1057. #define __EXT_MFC_TEMPLATED_WCHAR_T_ADAPTOR_NO_VTABLE __declspec(novtable)
  1058. #else
  1059. #define __EXT_MFC_TEMPLATED_WCHAR_T_ADAPTOR_NO_VTABLE
  1060. #endif
  1061. template < class _c_, class _n_ >
  1062. class __EXT_MFC_TEMPLATED_WCHAR_T_ADAPTOR_NO_VTABLE CExtNWCT
  1063. {
  1064. protected:
  1065. _c_ m_data;
  1066. public:
  1067. typedef CExtNWCT < _c_, _n_ > _Myt;
  1068. CExtNWCT( _c_ data )
  1069. : m_data( data )
  1070. {
  1071. }
  1072. CExtNWCT( _n_ data )
  1073. : m_data( * ( ( _c_ * ) ( &data ) ) )
  1074. {
  1075. }
  1076. CExtNWCT( const int _the_null_val = NULL )
  1077. // : m_data( reinterpret_cast < _c_ > ( _the_null_val ) )
  1078. // : m_data( _c_( *((_c_*)LPVOID(&_the_null_val)) ) )
  1079. : m_data( ( _c_ ) ( _the_null_val ) )
  1080. {
  1081. _the_null_val;
  1082. }
  1083. CExtNWCT( const _Myt & other )
  1084. : m_data( other.m_data )
  1085. {
  1086. }
  1087. operator _c_ ()
  1088. {
  1089. return m_data;
  1090. }
  1091. operator _n_ ()
  1092. {
  1093. return * ( ( _n_ * ) ( &m_data ) );
  1094. }
  1095. operator const _c_ () const
  1096. {
  1097. return m_data;
  1098. }
  1099. operator const _n_ () const
  1100. {
  1101. return * ( ( _n_ * ) ( &m_data ) );
  1102. }
  1103. _Myt & operator = ( const _Myt & other )
  1104. {
  1105. m_data = other.m_data;
  1106. return (*this);
  1107. }
  1108. _Myt & operator = ( _c_ data )
  1109. {
  1110. m_data = data;
  1111. return (*this);
  1112. }
  1113. _Myt & operator = ( _n_ data )
  1114. {
  1115. m_data = * ( ( _c_ * ) ( &data ) );
  1116. return (*this);
  1117. }
  1118. _Myt & operator = ( const int _the_null_val )
  1119. {
  1120. m_data = ( reinterpret_cast < _c_ > ( _the_null_val ) );
  1121. return (*this);
  1122. }
  1123. bool operator == ( const _Myt & other ) const
  1124. {
  1125. return (m_data == other.m_data) ? true : false;
  1126. }
  1127. bool operator == ( const _c_ & data ) const
  1128. {
  1129. return (m_data == data) ? true : false;
  1130. }
  1131. bool operator == ( const _n_ & data ) const
  1132. {
  1133. return (m_data == ( * ( ( _c_ * ) ( &data ) ) )) ? true : false;
  1134. }
  1135. bool operator == ( const int _the_null_val ) const
  1136. {
  1137. return (m_data == ( reinterpret_cast < _c_ > ( _the_null_val ) ) ) ? true : false;
  1138. }
  1139. bool operator != ( const _Myt & other ) const
  1140. {
  1141. return (m_data != other.m_data) ? true : false;
  1142. }
  1143. bool operator != ( const _c_ & data ) const
  1144. {
  1145. return (m_data != data) ? true : false;
  1146. }
  1147. bool operator != ( const _n_ & data ) const
  1148. {
  1149. return (m_data != ( * ( ( _c_ * ) ( &data ) ) )) ? true : false;
  1150. }
  1151. bool operator != ( const int _the_null_val ) const
  1152. {
  1153. // return (m_data != ( reinterpret_cast < _c_ > ( _the_null_val ) ) ) ? true : false;
  1154. return (m_data != ( (_c_) (int) ( _the_null_val ) ) ) ? true : false;
  1155. }
  1156. bool operator <= ( const _Myt & other ) const
  1157. {
  1158. return (m_data <= other.m_data) ? true : false;
  1159. }
  1160. bool operator <= ( const _c_ & data ) const
  1161. {
  1162. return (m_data <= data) ? true : false;
  1163. }
  1164. bool operator <= ( const _n_ & data ) const
  1165. {
  1166. return (m_data <= ( * ( ( _c_ * ) ( &data ) ) )) ? true : false;
  1167. }
  1168. bool operator >= ( const _Myt & other ) const
  1169. {
  1170. return (m_data >= other.m_data) ? true : false;
  1171. }
  1172. bool operator >= ( const _c_ & data ) const
  1173. {
  1174. return (m_data >= data) ? true : false;
  1175. }
  1176. bool operator >= ( const _n_ & data ) const
  1177. {
  1178. return (m_data >= ( * ( ( _c_ * ) ( &data ) ) )) ? true : false;
  1179. }
  1180. bool operator < ( const _Myt & other ) const
  1181. {
  1182. return (m_data < other.m_data) ? true : false;
  1183. }
  1184. bool operator < ( const _c_ & data ) const
  1185. {
  1186. return (m_data < data) ? true : false;
  1187. }
  1188. bool operator < ( const _n_ & data ) const
  1189. {
  1190. return (m_data < ( * ( ( _c_ * ) ( &data ) ) )) ? true : false;
  1191. }
  1192. bool operator > ( const _Myt & other ) const
  1193. {
  1194. return (m_data > other.m_data) ? true : false;
  1195. }
  1196. bool operator > ( const _c_ & data ) const
  1197. {
  1198. return (m_data > data) ? true : false;
  1199. }
  1200. bool operator > ( const _n_ & data ) const
  1201. {
  1202. return (m_data > ( * ( ( _c_ * ) ( &data ) ) )) ? true : false;
  1203. }
  1204. operator bool () const
  1205. {
  1206. return (m_data == reinterpret_cast < _c_ > ( NULL )) ? false : true;
  1207. }
  1208. // operator int () const
  1209. // {
  1210. // return (int)m_data;
  1211. // }
  1212. // operator long () const
  1213. // {
  1214. // return (long)m_data;
  1215. // }
  1216. // operator unsigned int () const
  1217. // {
  1218. // return (unsigned int)m_data;
  1219. // }
  1220. // operator unsigned long () const
  1221. // {
  1222. // return (unsigned long)m_data;
  1223. // }
  1224. }; // class CExtNWCT
  1225. template < class _c_, class _n_, class _a_ >
  1226. class __EXT_MFC_TEMPLATED_WCHAR_T_ADAPTOR_NO_VTABLE CExtNWCTA
  1227. : public CExtNWCT < _c_, _n_ >
  1228. {
  1229. public:
  1230. typedef CExtNWCTA < _c_, _n_, _a_ > _Myt;
  1231. typedef CExtNWCT < _c_, _n_ > _Mybt;
  1232. CExtNWCTA( _c_ data )
  1233. : _Mybt( data )
  1234. {
  1235. }
  1236. CExtNWCTA( _n_ data )
  1237. : _Mybt( data )
  1238. {
  1239. }
  1240. CExtNWCTA( const int _the_null_val = NULL )
  1241. : _Mybt( _the_null_val )
  1242. {
  1243. }
  1244. CExtNWCTA( const _Myt & other )
  1245. : _Mybt( other )
  1246. {
  1247. }
  1248. CExtNWCTA( const __prof_uis_used_CStringT & other )
  1249. : _Mybt( ( _i_ )( other.GetString() ) )
  1250. {
  1251. }
  1252. CExtNWCTA( const __prof_uis_converted_CStringT & other )
  1253. : _Mybt( ( _i_ )( other.GetString() ) )
  1254. {
  1255. }
  1256. // _Myt & operator = ( const __prof_uis_used_CStringT & other )
  1257. // {
  1258. // return _Mybt::operator = ( ( _i_ )( other.GetString() ) );
  1259. // }
  1260. // _Myt & operator = ( const __prof_uis_converted_CStringT & other )
  1261. // {
  1262. // return _Mybt::operator = ( ( _i_ )( other.GetString() ) );
  1263. // }
  1264. operator __prof_uis_used_CStringT () const
  1265. {
  1266. return __prof_uis_used_CStringT( (__prof_uis_used_CStringT::XCHAR *)m_data );
  1267. }
  1268. operator __prof_uis_converted_CStringT () const
  1269. {
  1270. return __prof_uis_converted_CStringT( (__prof_uis_converted_CStringT::XCHAR *)m_data );
  1271. }
  1272. _a_ operator [] ( int nIndex ) const
  1273. {
  1274. return ( ( _a_ ) ( m_data[ nIndex ] ) );
  1275. }
  1276. }; // class CExtNWCTA
  1277. template < class _c_, class _i_, class _n_ >
  1278. class __EXT_MFC_TEMPLATED_WCHAR_T_ADAPTOR_NO_VTABLE CExtNWCTC
  1279. {
  1280. protected:
  1281. _i_ m_data;
  1282. public:
  1283. typedef CExtNWCTC < _c_, _i_, _n_ > _Myt;
  1284. CExtNWCTC( _c_ data )
  1285. : m_data( const_cast < _i_ > ( data ) )
  1286. {
  1287. }
  1288. CExtNWCTC( _n_ data )
  1289. : m_data( * ( ( _i_ * ) ( &data ) ) )
  1290. {
  1291. }
  1292. CExtNWCTC( const int _the_null_val = NULL )
  1293. // : m_data( reinterpret_cast < _i_ > ( _the_null_val ) )
  1294. // : m_data( _i_( *((_i_*)LPVOID(&_the_null_val)) ) )
  1295. : m_data( reinterpret_cast < _i_ > ( _the_null_val ) )
  1296. {
  1297. _the_null_val;
  1298. }
  1299. CExtNWCTC( const _Myt & other )
  1300. : m_data( other.m_data )
  1301. {
  1302. }
  1303. operator _c_ () const
  1304. {
  1305. return m_data;
  1306. }
  1307. operator _n_ () const
  1308. {
  1309. return * ( ( _n_ * ) ( &m_data ) );
  1310. }
  1311. _Myt & operator = ( const _Myt & other )
  1312. {
  1313. m_data = other.m_data;
  1314. return (*this);
  1315. }
  1316. _Myt & operator = ( _c_ data  )
  1317. {
  1318. m_data = const_cast < _i_ > ( data );
  1319. return (*this);
  1320. }
  1321. _Myt & operator = ( _n_ data )
  1322. {
  1323. m_data = * ( ( _i_ * ) ( &data ) );
  1324. return (*this);
  1325. }
  1326. _Myt & operator = ( const int _the_null_val )
  1327. {
  1328. m_data = ( reinterpret_cast < _i_ > ( _the_null_val ) );
  1329. return (*this);
  1330. }
  1331. bool operator == ( const _Myt & other ) const
  1332. {
  1333. return (m_data == other.m_data) ? true : false;
  1334. }
  1335. bool operator == ( _c_ & data  ) const
  1336. {
  1337. return (m_data == ( const_cast < _i_ > ( data ) ) ) ? true : false;
  1338. }
  1339. bool operator == ( _n_ & data ) const
  1340. {
  1341. return (m_data == ( * ( ( _i_ * ) ( &data ) )) ) ? true : false;
  1342. }
  1343. bool operator == ( const int _the_null_val ) const
  1344. {
  1345. return (m_data == ( reinterpret_cast < _i_ > ( _the_null_val ) ) ) ? true : false;
  1346. }
  1347. bool operator != ( const _Myt & other ) const
  1348. {
  1349. return (m_data != other.m_data) ? true : false;
  1350. }
  1351. bool operator != ( _c_ & data  ) const
  1352. {
  1353. return (m_data != ( const_cast < _i_ > ( data ) ) ) ? true : false;
  1354. }
  1355. bool operator != ( _n_ & data ) const
  1356. {
  1357. return (m_data != ( * ( ( _i_ * ) ( &data ) )) ) ? true : false;
  1358. }
  1359. bool operator != ( const int _the_null_val ) const
  1360. {
  1361. // return (m_data != ( reinterpret_cast < _i_ > ( _the_null_val ) ) ) ? true : false;
  1362. return (m_data != ( (_c_) (int) ( _the_null_val ) ) ) ? true : false;
  1363. }
  1364. bool operator <= ( const _Myt & other ) const
  1365. {
  1366. return (m_data <= other.m_data) ? true : false;
  1367. }
  1368. bool operator <= ( _c_ & data  ) const
  1369. {
  1370. return (m_data <= ( const_cast < _i_ > ( data ) ) ) ? true : false;
  1371. }
  1372. bool operator <= ( _n_ & data ) const
  1373. {
  1374. return (m_data <= ( * ( ( _i_ * ) ( &data ) )) ) ? true : false;
  1375. }
  1376. bool operator >= ( const _Myt & other ) const
  1377. {
  1378. return (m_data >= other.m_data) ? true : false;
  1379. }
  1380. bool operator >= ( _c_ & data  ) const
  1381. {
  1382. return (m_data >= ( const_cast < _i_ > ( data ) ) ) ? true : false;
  1383. }
  1384. bool operator >= ( _n_ & data ) const
  1385. {
  1386. return (m_data >= ( * ( ( _i_ * ) ( &data ) )) ) ? true : false;
  1387. }
  1388. bool operator < ( const _Myt & other ) const
  1389. {
  1390. return (m_data < other.m_data) ? true : false;
  1391. }
  1392. bool operator < ( _c_ & data  ) const
  1393. {
  1394. return (m_data < ( const_cast < _i_ > ( data ) ) ) ? true : false;
  1395. }
  1396. bool operator < ( _n_ & data ) const
  1397. {
  1398. return (m_data < ( * ( ( _i_ * ) ( &data ) )) ) ? true : false;
  1399. }
  1400. bool operator > ( const _Myt & other ) const
  1401. {
  1402. return (m_data > other.m_data) ? true : false;
  1403. }
  1404. bool operator > ( _c_ & data  ) const
  1405. {
  1406. return (m_data > ( const_cast < _i_ > ( data ) ) ) ? true : false;
  1407. }
  1408. bool operator > ( _n_ & data ) const
  1409. {
  1410. return (m_data > ( * ( ( _i_ * ) ( &data ) )) ) ? true : false;
  1411. }
  1412. operator bool () const
  1413. {
  1414. return (m_data == reinterpret_cast < _i_ > ( NULL )) ? false : true;
  1415. }
  1416. // operator int () const
  1417. // {
  1418. // return (int)m_data;
  1419. // }
  1420. // operator long () const
  1421. // {
  1422. // return (long)m_data;
  1423. // }
  1424. // operator unsigned int () const
  1425. // {
  1426. // return (unsigned int)m_data;
  1427. // }
  1428. // operator unsigned long () const
  1429. // {
  1430. // return (unsigned long)m_data;
  1431. // }
  1432. }; // class CExtNWCTC
  1433. template < class _c_, class _i_, class _n_, class _a_ >
  1434. class __EXT_MFC_TEMPLATED_WCHAR_T_ADAPTOR_NO_VTABLE CExtNWCTCA
  1435. : public CExtNWCTC < _c_, _i_, _n_ >
  1436. {
  1437. public:
  1438. typedef CExtNWCTCA < _c_, _i_, _n_, _a_ > _Myt;
  1439. typedef CExtNWCTC < _c_, _i_, _n_ > _Mybt;
  1440. CExtNWCTCA( _c_ data )
  1441. : _Mybt( data )
  1442. {
  1443. }
  1444. CExtNWCTCA( _n_ data )
  1445. : _Mybt( data )
  1446. {
  1447. }
  1448. CExtNWCTCA( const int _the_null_val = NULL )
  1449. : _Mybt( _the_null_val )
  1450. {
  1451. }
  1452. CExtNWCTCA( const _Myt & other )
  1453. : _Mybt( other )
  1454. {
  1455. }
  1456. CExtNWCTCA( const __prof_uis_used_CStringT & other )
  1457. : _Mybt( ( _i_ )( other.GetString() ) )
  1458. {
  1459. }
  1460. CExtNWCTCA( const __prof_uis_converted_CStringT & other )
  1461. : _Mybt( ( _i_ )( other.GetString() ) )
  1462. {
  1463. }
  1464. // _Myt & operator = ( const __prof_uis_used_CStringT & other )
  1465. // {
  1466. // return _Mybt::operator = ( ( _i_ )( other.GetString() ) );
  1467. // }
  1468. // _Myt & operator = ( const __prof_uis_converted_CStringT & other )
  1469. // {
  1470. // return _Mybt::operator = ( ( _i_ )( other.GetString() ) );
  1471. // }
  1472. operator __prof_uis_used_CStringT () const
  1473. {
  1474. return __prof_uis_used_CStringT( (__prof_uis_used_CStringT::PCXSTR)m_data );
  1475. }
  1476. operator __prof_uis_converted_CStringT () const
  1477. {
  1478. return __prof_uis_converted_CStringT( (__prof_uis_converted_CStringT::PCXSTR)m_data );
  1479. }
  1480. _a_ operator [] ( int nIndex ) const
  1481. {
  1482. return ( ( _a_ ) ( m_data[ nIndex ] ) );
  1483. }
  1484. }; // CExtNWCTCA
  1485. typedef CExtNWCT   <       unsigned short     ,                            __wchar_t                               > __EXT_MFC_SAFE_TCHAR;
  1486. typedef CExtNWCTC  < const unsigned short     , unsigned short     , const __wchar_t                               > __EXT_MFC_SAFE_CONST_TCHAR;
  1487. typedef CExtNWCTA  <       unsigned short *   ,                            __wchar_t *   , __prof_uis_used_wchar_t > __EXT_MFC_SAFE_LPTSTR;
  1488. typedef CExtNWCTCA < const unsigned short *   , unsigned short *   , const __wchar_t *   , __prof_uis_used_wchar_t > __EXT_MFC_SAFE_LPCTSTR;
  1489. typedef CExtNWCT   <       unsigned short   & ,                            __wchar_t   &                           > __EXT_MFC_SAFE_TCHAR_REF;
  1490. typedef CExtNWCTC  < const unsigned short   & , unsigned short   & , const __wchar_t   &                           > __EXT_MFC_SAFE_CONST_TCHAR_REF;
  1491. typedef CExtNWCTA  <       unsigned short * & ,                            __wchar_t * & , __prof_uis_used_wchar_t > __EXT_MFC_SAFE_LPTSTR_REF;
  1492. typedef CExtNWCTCA < const unsigned short * & , unsigned short * & , const __wchar_t * & , __prof_uis_used_wchar_t > __EXT_MFC_SAFE_LPCTSTR_REF;
  1493. typedef CStringA CExtSafeStringA; // allways same as MFC's
  1494. class CExtSafeStringW : public __prof_uis_used_CStringT
  1495. {
  1496. public:
  1497. CExtSafeStringW()
  1498. {
  1499. }
  1500. // CExtSafeStringW( __EXT_MFC_SAFE_LPTSTR pszSrc )
  1501. // {
  1502. // const __prof_uis_used_wchar_t * ptr = pszSrc;
  1503. // (*this) = ptr;
  1504. // }
  1505. CExtSafeStringW( __EXT_MFC_SAFE_LPCTSTR pszSrc )
  1506. {
  1507. const __prof_uis_used_wchar_t * ptr = pszSrc;
  1508. (*this) = ptr;
  1509. }
  1510. explicit CExtSafeStringW( IAtlStringMgr * pStringMgr ) throw()
  1511. : __prof_uis_used_CStringT( pStringMgr )
  1512. {
  1513. }
  1514. // CExtSafeStringW( const VARIANT & varSrc )
  1515. // : __prof_uis_used_CStringT(  varSrc )
  1516. // {
  1517. // }
  1518. // CExtSafeStringW( const VARIANT & varSrc, IAtlStringMgr * pStringMgr )
  1519. // : __prof_uis_used_CStringT( varSrc, pStringMgr )
  1520. // {
  1521. // }
  1522. CExtSafeStringW( const CExtSafeStringW & strSrc )
  1523. : __prof_uis_used_CStringT( strSrc )
  1524. {
  1525. }
  1526. CExtSafeStringW( const __prof_uis_used_CStringT & strSrc )
  1527. : __prof_uis_used_CStringT( strSrc )
  1528. {
  1529. }
  1530. CExtSafeStringW( const XCHAR * pszSrc )
  1531. : __prof_uis_used_CStringT( pszSrc )
  1532. {
  1533. }
  1534. CExtSafeStringW( LPCSTR pszSrc, IAtlStringMgr * pStringMgr )
  1535. : __prof_uis_used_CStringT( pszSrc, pStringMgr )
  1536. {
  1537. }
  1538. CSTRING_EXPLICIT CExtSafeStringW( const YCHAR * pszSrc )
  1539. : __prof_uis_used_CStringT( pszSrc )
  1540. {
  1541. }
  1542. CExtSafeStringW( LPCWSTR pszSrc, IAtlStringMgr * pStringMgr )
  1543. : __prof_uis_used_CStringT( pszSrc, pStringMgr )
  1544. {
  1545. }
  1546. CSTRING_EXPLICIT CExtSafeStringW( const unsigned char * pszSrc )
  1547. : __prof_uis_used_CStringT( pszSrc )
  1548. {
  1549. }
  1550. CExtSafeStringW( const unsigned char * pszSrc, IAtlStringMgr * pStringMgr )
  1551. : __prof_uis_used_CStringT( pszSrc, pStringMgr )
  1552. {
  1553. }
  1554. CSTRING_EXPLICIT CExtSafeStringW( char ch, int nLength = 1 )
  1555. : __prof_uis_used_CStringT( ch, nLength )
  1556. {
  1557. }
  1558. CSTRING_EXPLICIT CExtSafeStringW( __prof_uis_used_wchar_t ch, int nLength = 1 )
  1559. : __prof_uis_used_CStringT( ((XCHAR *)(&ch)), nLength )
  1560. {
  1561. }
  1562. CSTRING_EXPLICIT CExtSafeStringW( __prof_uis_converted_wchar_t ch, int nLength = 1 )
  1563. : __prof_uis_used_CStringT( ((XCHAR *)(&ch)), nLength )
  1564. {
  1565. }
  1566. CExtSafeStringW( const XCHAR * pch, int nLength )
  1567. : __prof_uis_used_CStringT( pch, nLength )
  1568. {
  1569. }
  1570. CExtSafeStringW( const XCHAR * pch, int nLength, IAtlStringMgr * pStringMgr )
  1571. : __prof_uis_used_CStringT( pch, nLength, pStringMgr )
  1572. {
  1573. }
  1574. CExtSafeStringW( const YCHAR * pch, int nLength )
  1575. : __prof_uis_used_CStringT( pch, nLength )
  1576. {
  1577. }
  1578. CExtSafeStringW( const YCHAR * pch, int nLength, IAtlStringMgr * pStringMgr )
  1579. : __prof_uis_used_CStringT( pch, nLength, pStringMgr )
  1580. {
  1581. }
  1582. operator __prof_uis_converted_wchar_t * ()
  1583. {
  1584. LPVOID pData = (LPVOID)GetString();
  1585. return ( (__prof_uis_converted_wchar_t *) pData );
  1586. }
  1587. operator const __prof_uis_converted_wchar_t * () const
  1588. {
  1589. LPVOID pData = (LPVOID)GetString();
  1590. return ( (__prof_uis_converted_wchar_t *) pData );
  1591. }
  1592. operator __prof_uis_used_wchar_t * ()
  1593. {
  1594. LPVOID pData = (LPVOID)GetString();
  1595. return ( (__prof_uis_used_wchar_t *) pData );
  1596. }
  1597. operator const __prof_uis_used_wchar_t * () const
  1598. {
  1599. LPVOID pData = (LPVOID)GetString();
  1600. return ( (__prof_uis_used_wchar_t *) pData );
  1601. }
  1602. operator __EXT_MFC_SAFE_LPTSTR ()
  1603. {
  1604. LPVOID pData = (LPVOID)GetString();
  1605. return __EXT_MFC_SAFE_LPTSTR( (__prof_uis_used_wchar_t *) pData );
  1606. }
  1607. operator __EXT_MFC_SAFE_LPCTSTR () const
  1608. {
  1609. LPVOID pData = (LPVOID)GetString();
  1610. return __EXT_MFC_SAFE_LPCTSTR( (__prof_uis_used_wchar_t *) pData );
  1611. }
  1612. operator __prof_uis_converted_CStringT & ()
  1613. {
  1614. return * ( ( __prof_uis_converted_CStringT * ) ( this ) );
  1615. }
  1616. operator const __prof_uis_converted_CStringT & () const
  1617. {
  1618. return * ( ( __prof_uis_converted_CStringT * ) ( this ) );
  1619. }
  1620. CExtSafeStringW & operator = (
  1621. const __prof_uis_used_wchar_t * other
  1622. )
  1623. {
  1624. __prof_uis_used_CStringT::operator = ( other );
  1625. return (*this);
  1626. }
  1627. CExtSafeStringW & operator = (
  1628. const __prof_uis_converted_wchar_t * other
  1629. )
  1630. {
  1631. return ( operator = ( (__prof_uis_used_wchar_t *)other ) );
  1632. }
  1633. CExtSafeStringW & operator = ( __prof_uis_converted_wchar_t ch )
  1634. {
  1635. __prof_uis_used_wchar_t ach[2] = { ((__prof_uis_used_wchar_t)ch), 0 };
  1636. return ( operator = ( reinterpret_cast < PCXSTR > ( ach ) ) );
  1637. }
  1638. CExtSafeStringW & operator = ( __prof_uis_used_wchar_t ch )
  1639. {
  1640. __prof_uis_used_wchar_t ach[2] = { ((__prof_uis_used_wchar_t)ch), 0 };
  1641. return ( operator=( reinterpret_cast < PCXSTR > ( ach ) ) );
  1642. }
  1643. CExtSafeStringW & operator = ( const __prof_uis_used_CStringT & other )
  1644. {
  1645. return ( operator = ( reinterpret_cast < PCXSTR > ( other.GetString() ) ) );
  1646. }
  1647. CExtSafeStringW & operator = ( const __prof_uis_converted_CStringT & other )
  1648. {
  1649. return ( operator = ( reinterpret_cast < PCXSTR > ( other.GetString() ) ) );
  1650. }
  1651. CExtSafeStringW & operator = (
  1652. __EXT_MFC_SAFE_LPTSTR s
  1653. )
  1654. {
  1655. return ( operator = ( ( const __prof_uis_used_wchar_t * ) ( s ) ) );
  1656. }
  1657. CExtSafeStringW & operator = (
  1658. __EXT_MFC_SAFE_LPCTSTR s
  1659. )
  1660. {
  1661. return ( operator = ( ( const __prof_uis_used_wchar_t * ) ( s ) ) );
  1662. }
  1663. friend CExtSafeStringW operator + (
  1664. const __prof_uis_used_CStringT & str1,
  1665. __prof_uis_converted_wchar_t * psz2
  1666. )
  1667. {
  1668. return
  1669. // disable warning 4675
  1670. #pragma warning( push )
  1671. #pragma warning ( disable : 4675 )
  1672. operator + (
  1673. str1,
  1674. reinterpret_cast < PCXSTR > ( psz2 )
  1675. );
  1676. // rollback warning 4675
  1677. #pragma warning( pop )
  1678. }
  1679. friend CExtSafeStringW operator + (
  1680. __prof_uis_converted_wchar_t * psz1,
  1681. const __prof_uis_used_CStringT & str2
  1682. )
  1683. {
  1684. // disable warning 4675
  1685. #pragma warning( push )
  1686. #pragma warning ( disable : 4675 )
  1687. return
  1688. operator + (
  1689. reinterpret_cast < PCXSTR > ( psz1 ),
  1690. str2
  1691. );
  1692. // rollback warning 4675
  1693. #pragma warning( pop )
  1694. }
  1695. CExtSafeStringW & operator += ( const char * pszSrc )
  1696. {
  1697. __prof_uis_used_CStringT::operator += ( pszSrc );
  1698. return (*this);
  1699. }
  1700. CExtSafeStringW & operator += ( const __prof_uis_converted_wchar_t * pszSrc )
  1701. {
  1702. __prof_uis_used_CStringT::operator += ( reinterpret_cast < PCXSTR > ( pszSrc ) );
  1703. return (*this);
  1704. }
  1705. CExtSafeStringW & operator += ( const CExtSafeStringW & s )
  1706. {
  1707. __prof_uis_used_CStringT::operator += ( s );
  1708. return (*this);
  1709. }
  1710. CExtSafeStringW & operator += ( char ch )
  1711. {
  1712. __prof_uis_used_CStringT::operator += ( ch );
  1713. return (*this);
  1714. }
  1715. CExtSafeStringW & operator += ( __prof_uis_used_wchar_t ch )
  1716. {
  1717. __prof_uis_used_CStringT::operator += ( (unsigned char)ch );
  1718. return (*this);
  1719. }
  1720. CExtSafeStringW & operator += ( __prof_uis_converted_wchar_t ch )
  1721. {
  1722. __prof_uis_used_CStringT::operator += ( (unsigned char)ch );
  1723. return (*this);
  1724. }
  1725. friend CExtSafeStringW operator + (
  1726. const __prof_uis_used_CStringT & str1,
  1727. const char * psz2
  1728. )
  1729. {
  1730. // disable warning 4675
  1731. #pragma warning( push )
  1732. #pragma warning ( disable : 4675 )
  1733. return
  1734. operator + (
  1735. str1,
  1736. CExtSafeStringW( psz2 )
  1737. );
  1738. // rollback warning 4675
  1739. #pragma warning( pop )
  1740. }
  1741. friend CExtSafeStringW operator + (
  1742. const __prof_uis_used_CStringT & str1,
  1743. const __prof_uis_converted_wchar_t * psz2
  1744. )
  1745. {
  1746. // disable warning 4675
  1747. #pragma warning( push )
  1748. #pragma warning ( disable : 4675 )
  1749. return
  1750. operator + (
  1751. str1,
  1752. reinterpret_cast < PCXSTR > ( psz2 )
  1753. );
  1754. // rollback warning 4675
  1755. #pragma warning( pop )
  1756. }
  1757. friend CExtSafeStringW operator + (
  1758. const char * psz1,
  1759. const __prof_uis_used_CStringT & str2
  1760. )
  1761. {
  1762. return
  1763. operator + (
  1764. CExtSafeStringW( psz1 ),
  1765. str2
  1766. );
  1767. }
  1768. friend CExtSafeStringW operator + (
  1769. const __prof_uis_converted_wchar_t * psz1,
  1770. const __prof_uis_used_CStringT & str2
  1771. )
  1772. {
  1773. return
  1774. operator + (
  1775. reinterpret_cast < PCXSTR > ( psz1 ),
  1776. str2
  1777. );
  1778. }
  1779. // friend CExtSafeStringW operator + (
  1780. // const __prof_uis_used_CStringT & str1,
  1781. // __prof_uis_converted_wchar_t ch2
  1782. // )
  1783. // {
  1784. // return
  1785. // operator + (
  1786. // str1,
  1787. // * ( reinterpret_cast < XCHAR * > ( &ch2 ) )
  1788. // );
  1789. // }
  1790. // friend CExtSafeStringW operator + (
  1791. // __prof_uis_converted_wchar_t ch1,
  1792. // const __prof_uis_used_CStringT & str2
  1793. // )
  1794. // {
  1795. // return
  1796. // operator + (
  1797. // * ( reinterpret_cast < XCHAR * > ( &ch1 ) ),
  1798. // str2
  1799. // );
  1800. // }
  1801. friend bool operator == (
  1802. const __prof_uis_used_CStringT & str1,
  1803. const __prof_uis_converted_wchar_t * psz2
  1804. ) throw()
  1805. {
  1806. return ( str1.Compare( reinterpret_cast < PCXSTR > ( psz2 ) ) == 0 );
  1807. }
  1808. friend bool operator == (
  1809. const __prof_uis_converted_wchar_t * psz1,
  1810. const __prof_uis_used_CStringT & str2
  1811. ) throw()
  1812. {
  1813. return ( str2.Compare( reinterpret_cast < PCXSTR > ( psz1 ) ) == 0 );
  1814. }
  1815. friend bool operator != (
  1816. const __prof_uis_used_CStringT & str1,
  1817. const __prof_uis_converted_wchar_t * psz2
  1818. ) throw()
  1819. {
  1820. return ( str1.Compare( reinterpret_cast < PCXSTR > ( psz2 ) ) != 0 );
  1821. }
  1822. friend bool operator != (
  1823. const __prof_uis_converted_wchar_t * psz1,
  1824. const __prof_uis_used_CStringT & str2
  1825. ) throw()
  1826. {
  1827. return ( str2.Compare( reinterpret_cast < PCXSTR > ( psz1 ) ) != 0 );
  1828. }
  1829. friend bool operator < (
  1830. const __prof_uis_used_CStringT & str1,
  1831. const __prof_uis_converted_wchar_t * psz2
  1832. ) throw()
  1833. {
  1834. return ( str1.Compare( reinterpret_cast < PCXSTR > ( psz2 ) ) < 0 );
  1835. }
  1836. friend bool operator < (
  1837. const __prof_uis_converted_wchar_t * psz1,
  1838. const __prof_uis_used_CStringT & str2
  1839. ) throw()
  1840. {
  1841. return ( str2.Compare( reinterpret_cast < PCXSTR > ( psz1 ) ) >= 0 );
  1842. }
  1843. friend bool operator > (
  1844. const __prof_uis_used_CStringT & str1,
  1845. const __prof_uis_converted_wchar_t * psz2
  1846. ) throw()
  1847. {
  1848. return ( str1.Compare( reinterpret_cast < PCXSTR > ( psz2 ) ) > 0 );
  1849. }
  1850. friend bool operator > (
  1851. const __prof_uis_converted_wchar_t * psz1,
  1852. const __prof_uis_used_CStringT & str2
  1853. ) throw()
  1854. {
  1855. return ( str2.Compare( reinterpret_cast < PCXSTR > ( psz1 ) ) <= 0 );
  1856. }
  1857. friend bool operator <= (
  1858. const __prof_uis_used_CStringT & str1,
  1859. const __prof_uis_converted_wchar_t * psz2
  1860. ) throw()
  1861. {
  1862. return ( str1.Compare( reinterpret_cast < PCXSTR > ( psz2 ) ) <= 0 );
  1863. }
  1864. friend bool operator <= (
  1865. const __prof_uis_converted_wchar_t * psz1, 
  1866. const __prof_uis_used_CStringT & str2
  1867. ) throw()
  1868. {
  1869. return ( str2.Compare( reinterpret_cast < PCXSTR > ( psz1 ) ) > 0 );
  1870. }
  1871. friend bool operator >= (
  1872. const __prof_uis_used_CStringT & str1,
  1873. const __prof_uis_converted_wchar_t * psz2
  1874. ) throw()
  1875. {
  1876. return ( str1.Compare( reinterpret_cast < PCXSTR > ( psz2 ) ) >= 0 );
  1877. }
  1878. friend bool operator >= (
  1879. const __prof_uis_converted_wchar_t * psz1,
  1880. const __prof_uis_used_CStringT & str2
  1881. ) throw()
  1882. {
  1883. return ( str2.Compare( reinterpret_cast < PCXSTR > ( psz1 ) ) < 0 );
  1884. }
  1885. friend bool operator == (
  1886. __prof_uis_converted_wchar_t ch1,
  1887. const __prof_uis_used_CStringT & str2
  1888. ) throw()
  1889. {
  1890. return ( (str2.GetLength() == 1) && (str2[0] == ( * ( reinterpret_cast < XCHAR * > ( &ch1 ) ) )) );
  1891. }
  1892. friend bool operator == (
  1893. const __prof_uis_used_CStringT & str1,
  1894. __prof_uis_converted_wchar_t ch2
  1895. ) throw()
  1896. {
  1897. return ( (str1.GetLength() == 1) && (str1[0] == ( * ( reinterpret_cast < XCHAR * > ( &ch2 ) ) )) );
  1898. }
  1899. friend bool operator != (
  1900. __prof_uis_converted_wchar_t ch1,
  1901. const __prof_uis_used_CStringT & str2
  1902. ) throw()
  1903. {
  1904. return ( (str2.GetLength() != 1) || (str2[0] != ( * ( reinterpret_cast < XCHAR * > ( &ch1 ) ) )) );
  1905. }
  1906. friend bool operator != (
  1907. const __prof_uis_used_CStringT & str1,
  1908. __prof_uis_converted_wchar_t ch2
  1909. ) throw()
  1910. {
  1911. return ( (str1.GetLength() != 1) || (str1[0] != ( * ( reinterpret_cast < XCHAR * > ( &ch2 ) ) )) );
  1912. }
  1913. void __cdecl Format( const __prof_uis_converted_wchar_t * pszFormat, ... )
  1914. {
  1915. ATLASSERT( AtlIsValidString( ((LPCWSTR)pszFormat) ) );
  1916. va_list argList;
  1917. va_start( argList, pszFormat );
  1918. FormatV( ((PCXSTR)pszFormat), argList );
  1919. va_end( argList );
  1920. }
  1921. void __cdecl Format( const __prof_uis_used_wchar_t * pszFormat, ... )
  1922. {
  1923. ATLASSERT( AtlIsValidString( ((LPCWSTR)pszFormat) ) );
  1924. va_list argList;
  1925. va_start( argList, pszFormat );
  1926. FormatV( ((PCXSTR)pszFormat), argList );
  1927. va_end( argList );
  1928. }
  1929. }; // class CExtSafeStringW
  1930. typedef CExtSafeStringW CExtSafeString;
  1931. class CExtSafeStringArray : public CStringArray
  1932. {
  1933. public:
  1934. const CExtSafeString & GetAt( INT_PTR nIndex ) const
  1935. {
  1936. const CString & s = CStringArray::GetAt( nIndex );
  1937. return * ( ( CExtSafeString * ) ( & s ) ); // Xtra-dirty-cast
  1938. }
  1939. void SetAt(
  1940. INT_PTR nIndex,
  1941. __EXT_MFC_SAFE_LPCTSTR newElement
  1942. )
  1943. {
  1944. CStringArray::SetAt(
  1945. nIndex,
  1946. (LPCTSTR)newElement
  1947. );
  1948. }
  1949. void SetAt(
  1950. INT_PTR nIndex,
  1951. const CExtSafeString & newElement
  1952. )
  1953. {
  1954. const CString & s = * ( ( CString * ) ( & newElement ) ); // Xtra-dirty-cast
  1955. CStringArray::SetAt(
  1956. nIndex,
  1957. s
  1958. );
  1959. }
  1960. CExtSafeString & ElementAt( INT_PTR nIndex )
  1961. {
  1962. CString & s = CStringArray::ElementAt( nIndex );
  1963. return * ( ( CExtSafeString * ) ( & s ) ); // Xtra-dirty-cast
  1964. }
  1965. const CExtSafeString * GetData() const
  1966. {
  1967. const CString * s = CStringArray::GetData();
  1968. return ( ( CExtSafeString * ) (  s ) ); // Xtra-dirty-cast
  1969. }
  1970. CExtSafeString * GetData()
  1971. {
  1972. CString * s = CStringArray::GetData();
  1973. return ( ( CExtSafeString * ) (  s ) ); // Xtra-dirty-cast
  1974. }
  1975. void SetAtGrow(
  1976. INT_PTR nIndex,
  1977. __EXT_MFC_SAFE_LPCTSTR newElement
  1978. )
  1979. {
  1980. CStringArray::SetAtGrow(
  1981. nIndex,
  1982. (LPCTSTR)newElement
  1983. );
  1984. }
  1985. void SetAtGrow(
  1986. INT_PTR nIndex,
  1987. const CExtSafeString & newElement
  1988. )
  1989. {
  1990. CStringArray::SetAtGrow(
  1991. nIndex,
  1992. * ( ( CString * ) ( & newElement ) ) // Xtra-dirty-cast
  1993. );
  1994. }
  1995. INT_PTR Add( __EXT_MFC_SAFE_LPCTSTR newElement )
  1996. {
  1997. return
  1998. CStringArray::Add(
  1999. (LPCTSTR)newElement
  2000. );
  2001. }
  2002. INT_PTR Add( const CExtSafeString & newElement )
  2003. {
  2004. return
  2005. CStringArray::Add(
  2006. * ( ( CString * ) ( & newElement ) ) // Xtra-dirty-cast
  2007. );
  2008. }
  2009. const CExtSafeString & operator [] ( INT_PTR nIndex ) const
  2010. {
  2011. const CString & s = CStringArray::operator [] ( nIndex );
  2012. return * ( ( CExtSafeString * ) ( & s ) ); // Xtra-dirty-cast
  2013. }
  2014. CExtSafeString & operator [] ( INT_PTR nIndex )
  2015. {
  2016. CString & s = CStringArray::operator [] ( nIndex );
  2017. return * ( ( CExtSafeString * ) ( & s ) ); // Xtra-dirty-cast
  2018. }
  2019. void InsertAt(
  2020. INT_PTR nIndex,
  2021. __EXT_MFC_SAFE_LPCTSTR newElement,
  2022. INT_PTR nCount = 1
  2023. )
  2024. {
  2025. CStringArray::InsertAt(
  2026. nIndex,
  2027. (LPCTSTR)newElement,
  2028. nCount
  2029. );
  2030. }
  2031. void InsertAt(
  2032. INT_PTR nIndex,
  2033. const CString & newElement,
  2034. INT_PTR nCount = 1
  2035. )
  2036. {
  2037. CStringArray::InsertAt(
  2038. nIndex,
  2039. * ( ( CString * ) ( & newElement ) ), // Xtra-dirty-cast
  2040. nCount
  2041. );
  2042. }
  2043. }; // class CExtSafeStringArray
  2044. class CExtSafeStringList : public CStringList
  2045. {
  2046. public:
  2047. CExtSafeStringList( INT_PTR nBlockSize = 10 )
  2048. : CStringList( nBlockSize )
  2049. {
  2050. }
  2051. CExtSafeString & GetHead()
  2052. {
  2053. CString & s = CStringList::GetHead();
  2054. return * ( ( CExtSafeString * ) ( & s ) ); // Xtra-dirty-cast
  2055. }
  2056. const CExtSafeString & GetHead() const
  2057. {
  2058. const CString & s = CStringList::GetHead();
  2059. return * ( ( CExtSafeString * ) ( & s ) ); // Xtra-dirty-cast
  2060. }
  2061. CExtSafeString & GetTail()
  2062. {
  2063. CString & s = CStringList::GetTail();
  2064. return * ( ( CExtSafeString * ) ( & s ) ); // Xtra-dirty-cast
  2065. }
  2066. const CExtSafeString & GetTail() const
  2067. {
  2068. const CString & s = CStringList::GetTail();
  2069. return * ( ( CExtSafeString * ) ( & s ) ); // Xtra-dirty-cast
  2070. }
  2071. CExtSafeString RemoveHead()
  2072. {
  2073. return CExtSafeString( (LPCTSTR)CStringList::RemoveHead() );
  2074. }
  2075. CExtSafeString RemoveTail()
  2076. {
  2077. return CExtSafeString( (LPCTSTR)CStringList::RemoveTail() );
  2078. }
  2079. POSITION AddHead( __EXT_MFC_SAFE_LPCTSTR newElement )
  2080. {
  2081. return CStringList::AddHead( (LPCTSTR)newElement );
  2082. }
  2083. POSITION AddTail( __EXT_MFC_SAFE_LPCTSTR newElement )
  2084. {
  2085. return CStringList::AddTail( (LPCTSTR)newElement );
  2086. }
  2087. POSITION AddHead( const CExtSafeString & newElement )
  2088. {
  2089. return CStringList::AddHead( (LPCTSTR)newElement );
  2090. }
  2091. void AddHead( CExtSafeStringList * pNewList )
  2092. {
  2093. CStringList::AddHead( (CStringList *)pNewList );
  2094. }
  2095. POSITION AddTail( const CExtSafeString & newElement )
  2096. {
  2097. return CStringList::AddTail( (LPCTSTR)newElement );
  2098. }
  2099. void AddTail( CExtSafeStringList * pNewList )
  2100. {
  2101. CStringList::AddTail( (CStringList *)pNewList );
  2102. }
  2103. CExtSafeString & GetNext( POSITION & rPosition )
  2104. {
  2105. CString & s = CStringList::GetNext( rPosition );
  2106. return * ( ( CExtSafeString * ) ( & s ) ); // Xtra-dirty-cast
  2107. }
  2108. const CExtSafeString & GetNext( POSITION & rPosition ) const
  2109. {
  2110. const CString & s = CStringList::GetNext( rPosition );
  2111. return * ( ( CExtSafeString * ) ( & s ) ); // Xtra-dirty-cast
  2112. }
  2113. CExtSafeString & GetPrev( POSITION & rPosition )
  2114. {
  2115. CString & s = CStringList::GetPrev( rPosition );
  2116. return * ( ( CExtSafeString * ) ( & s ) ); // Xtra-dirty-cast
  2117. }
  2118. const CExtSafeString & GetPrev( POSITION & rPosition ) const
  2119. {
  2120. const CString & s = CStringList::GetPrev( rPosition );
  2121. return * ( ( CExtSafeString * ) ( & s ) ); // Xtra-dirty-cast
  2122. }
  2123. CExtSafeString & GetAt( POSITION position )
  2124. {
  2125. CString & s = CStringList::GetAt( position );
  2126. return * ( ( CExtSafeString * ) ( & s ) ); // Xtra-dirty-cast
  2127. }
  2128. const CExtSafeString & GetAt( POSITION position ) const
  2129. {
  2130. const CString & s = CStringList::GetAt( position );
  2131. return * ( ( CExtSafeString * ) ( & s ) ); // Xtra-dirty-cast
  2132. }
  2133. void SetAt( POSITION pos, __EXT_MFC_SAFE_LPCTSTR newElement )
  2134. {
  2135. CStringList::SetAt( pos, (LPCTSTR)newElement );
  2136. }
  2137. void SetAt( POSITION pos, const CExtSafeString & newElement )
  2138. {
  2139. CStringList::SetAt( pos, (LPCTSTR)newElement );
  2140. }
  2141. POSITION InsertBefore( POSITION position, __EXT_MFC_SAFE_LPCTSTR newElement )
  2142. {
  2143. return CStringList::InsertBefore( position, (LPCTSTR)newElement );
  2144. }
  2145. POSITION InsertAfter( POSITION position, __EXT_MFC_SAFE_LPCTSTR newElement )
  2146. {
  2147. return CStringList::InsertAfter( position, (LPCTSTR)newElement );
  2148. }
  2149. POSITION InsertBefore( POSITION position, const CExtSafeString & newElement )
  2150. {
  2151. return CStringList::InsertBefore( position, (LPCTSTR)newElement );
  2152. }
  2153. POSITION InsertAfter( POSITION position, const CExtSafeString & newElement )
  2154. {
  2155. return CStringList::InsertAfter( position, (LPCTSTR)newElement );
  2156. }
  2157. POSITION Find( __EXT_MFC_SAFE_LPCTSTR searchValue, POSITION startAfter = NULL ) const
  2158. {
  2159. return CStringList::Find( searchValue, startAfter );
  2160. }
  2161. }; // class CExtSafeStringList
  2162. class CExtSafeMapStringToPtr : public CMapStringToPtr
  2163. {
  2164. public:
  2165. CExtSafeMapStringToPtr(
  2166. INT_PTR nBlockSize = 10
  2167. )
  2168. : CMapStringToPtr( nBlockSize )
  2169. {
  2170. }
  2171. BOOL Lookup(
  2172. __EXT_MFC_SAFE_LPCTSTR key,
  2173. void * & rValue
  2174. ) const
  2175. {
  2176. return
  2177. CMapStringToPtr::Lookup(
  2178. key,
  2179. rValue
  2180. );
  2181. }
  2182. BOOL LookupKey(
  2183. __EXT_MFC_SAFE_LPCTSTR key,
  2184. __EXT_MFC_SAFE_LPCTSTR & rKey
  2185. ) const
  2186. {
  2187. return
  2188. CMapStringToPtr::LookupKey(
  2189. key,
  2190. (LPCTSTR &) rKey
  2191. );
  2192. }
  2193. void * & operator [] (
  2194. __EXT_MFC_SAFE_LPCTSTR key
  2195. )
  2196. {
  2197. return CMapStringToPtr::operator []( key );
  2198. }
  2199. void SetAt(
  2200. __EXT_MFC_SAFE_LPCTSTR key,
  2201. void * newValue
  2202. )
  2203. {
  2204. CMapStringToPtr::SetAt(
  2205. key,
  2206. newValue
  2207. );
  2208. }
  2209. BOOL RemoveKey(
  2210. __EXT_MFC_SAFE_LPCTSTR key
  2211. )
  2212. {
  2213. return CMapStringToPtr::RemoveKey( key );
  2214. }
  2215. void GetNextAssoc(
  2216. POSITION & rNextPosition,
  2217. CExtSafeString & rKey,
  2218. void * & rValue
  2219. ) const
  2220. {
  2221. CMapStringToPtr::GetNextAssoc(
  2222. rNextPosition,
  2223. (CString&) rKey, // Xtra-dirty-cast
  2224. rValue
  2225. );
  2226. }
  2227. UINT HashKey(
  2228. __EXT_MFC_SAFE_LPCTSTR key
  2229. ) const
  2230. {
  2231. return CMapStringToPtr::HashKey( key );
  2232. }
  2233. }; // class CExtSafeMapStringToPtr
  2234. class CExtSafeMapStringToOb : public CMapStringToOb
  2235. {
  2236. public:
  2237. CExtSafeMapStringToOb( INT_PTR nBlockSize = 10 )
  2238. : CMapStringToOb( nBlockSize )
  2239. {
  2240. }
  2241. BOOL Lookup(
  2242. __EXT_MFC_SAFE_LPCTSTR key,
  2243. CObject * & rValue
  2244. ) const
  2245. {
  2246. return
  2247. CMapStringToOb::Lookup(
  2248. key,
  2249. rValue
  2250. );
  2251. }
  2252. BOOL LookupKey(
  2253. __EXT_MFC_SAFE_LPCTSTR key,
  2254. __EXT_MFC_SAFE_LPCTSTR & rKey
  2255. ) const
  2256. {
  2257. return
  2258. CMapStringToOb::LookupKey(
  2259. key,
  2260. (LPCTSTR &) rKey
  2261. );
  2262. }
  2263. CObject * & operator [] ( __EXT_MFC_SAFE_LPCTSTR key )
  2264. {
  2265. return CMapStringToOb::operator [] ( key );
  2266. }
  2267. void SetAt(
  2268. __EXT_MFC_SAFE_LPCTSTR key,
  2269. CObject * newValue
  2270. )
  2271. {
  2272. CMapStringToOb::SetAt(
  2273. key,
  2274. newValue
  2275. );
  2276. }
  2277. BOOL RemoveKey( __EXT_MFC_SAFE_LPCTSTR key )
  2278. {
  2279. return CMapStringToOb::RemoveKey( key );
  2280. }
  2281. void GetNextAssoc(
  2282. POSITION & rNextPosition,
  2283. CExtSafeString & rKey,
  2284. CObject * & rValue
  2285. ) const
  2286. {
  2287. CMapStringToOb::GetNextAssoc(
  2288. rNextPosition,
  2289. (CString&) rKey, // Xtra-dirty-cast
  2290. rValue
  2291. );
  2292. }
  2293. UINT HashKey( __EXT_MFC_SAFE_LPCTSTR key ) const
  2294. {
  2295. return CMapStringToOb::HashKey( key );
  2296. }
  2297. }; // class CExtSafeMapStringToOb
  2298. class CExtSafeMapStringToString : public CMapStringToString
  2299. {
  2300. public:
  2301. CExtSafeMapStringToString( INT_PTR nBlockSize = 10 )
  2302. : CMapStringToString( nBlockSize )
  2303. {
  2304. }
  2305. BOOL Lookup(
  2306. __EXT_MFC_SAFE_LPCTSTR key,
  2307. CExtSafeString & rValue
  2308. ) const
  2309. {
  2310. return
  2311. CMapStringToString::Lookup(
  2312. key,
  2313. (CString &) rValue // Xtra-dirty-cast
  2314. );
  2315. }
  2316. const CPair * PLookup( __EXT_MFC_SAFE_LPCTSTR key ) const
  2317. {
  2318. return CMapStringToString::PLookup( key );
  2319. }
  2320. CPair * PLookup( __EXT_MFC_SAFE_LPCTSTR key )
  2321. {
  2322. return CMapStringToString::PLookup( key );
  2323. }
  2324. BOOL LookupKey(
  2325. __EXT_MFC_SAFE_LPCTSTR key,
  2326. __EXT_MFC_SAFE_LPCTSTR & rKey
  2327. ) const
  2328. {
  2329. return
  2330. CMapStringToString::LookupKey(
  2331. key,
  2332. (LPCTSTR &) rKey
  2333. );
  2334. }
  2335. CExtSafeString & operator [] ( __EXT_MFC_SAFE_LPCTSTR key )
  2336. {
  2337. CString & s = CMapStringToString::operator [] ( key );
  2338. return * ( ( CExtSafeString * ) ( & s ) ); // Xtra-dirty-cast
  2339. }
  2340. void SetAt(
  2341. __EXT_MFC_SAFE_LPCTSTR key,
  2342. __EXT_MFC_SAFE_LPCTSTR newValue
  2343. )
  2344. {
  2345. CMapStringToString::SetAt(
  2346. key,
  2347. newValue
  2348. );
  2349. }
  2350. BOOL RemoveKey(
  2351. __EXT_MFC_SAFE_LPCTSTR key
  2352. )
  2353. {
  2354. return
  2355. CMapStringToString::RemoveKey(
  2356. key
  2357. );
  2358. }
  2359. void GetNextAssoc(
  2360. POSITION & rNextPosition,
  2361. CExtSafeString & rKey,
  2362. CExtSafeString & rValue
  2363. ) const
  2364. {
  2365. CMapStringToString::GetNextAssoc(
  2366. rNextPosition,
  2367. (CString &) rKey, // Xtra-dirty-cast
  2368. (CString &) rValue // Xtra-dirty-cast
  2369. );
  2370. }
  2371. UINT HashKey(__EXT_MFC_SAFE_LPCTSTR key) const
  2372. {
  2373. return CMapStringToString::HashKey( key );
  2374. }
  2375. }; // class CExtSafeMapStringToString
  2376. #define __EXT_MFC_SAFE_ON_WM_DEVMODECHANGE() 
  2377. { WM_DEVMODECHANGE, 0, 0, 0, AfxSig_vs, 
  2378. (AFX_PMSG)(AFX_PMSGW) 
  2379. (static_cast < void (AFX_MSG_CALL CWnd::*)(__EXT_MFC_SAFE_LPTSTR) > (OnDevModeChange)) },
  2380. #define __EXT_MFC_SAFE_ON_WM_ASKCBFORMATNAME() 
  2381. { WM_ASKCBFORMATNAME, 0, 0, 0, AfxSig_vwl, 
  2382. (AFX_PMSG)(AFX_PMSGW) 
  2383. (static_cast < void (AFX_MSG_CALL CWnd::*)(UINT, __EXT_MFC_SAFE_LPTSTR) > (OnAskCbFormatName)) },
  2384. #define __EXT_MFC_SAFE_ON_WM_SETTINGCHANGE() 
  2385. { WM_SETTINGCHANGE, 0, 0, 0, AfxSig_vws, 
  2386. (AFX_PMSG)(AFX_PMSGW) 
  2387. (static_cast < void (AFX_MSG_CALL CWnd::*)(UINT, __EXT_MFC_SAFE_LPCTSTR) > (OnSettingChange)) },
  2388. #define __EXT_MFC_SAFE_ON_WM_WININICHANGE() 
  2389. { WM_WININICHANGE, 0, 0, 0, AfxSig_vs, 
  2390. (AFX_PMSG)(AFX_PMSGW) 
  2391. (static_cast < void (AFX_MSG_CALL CWnd::*)(__EXT_MFC_SAFE_LPCTSTR) > (OnWinIniChange)) },
  2392. #else // if - (defined __EXT_MFC_ENABLE_TEMPLATED_CHARS)
  2393. #pragma message("   Prof-UIS native unicode character type support:")
  2394. #pragma message("      disabled (symbol __EXT_MFC_ENABLE_TEMPLATED_CHARS is not defined)")
  2395. #endif // if not - (defined __EXT_MFC_ENABLE_TEMPLATED_CHARS)
  2396. #endif // (defined _UNICODE) && (defined _WCHAR_T_DEFINED) && (defined __EXT_MFC_ENABLE_TEMPLATED_CHARS)
  2397. #endif // #if _MFC_VER >= 0x700
  2398. #if (!defined __EXT_MFC_TEMPLATED_CHARS_IMPLEMENTED)
  2399. typedef         TCHAR   __EXT_MFC_SAFE_TCHAR;
  2400. typedef const   TCHAR   __EXT_MFC_SAFE_CONST_TCHAR;
  2401. typedef LPTSTR          __EXT_MFC_SAFE_LPTSTR;
  2402. typedef LPCTSTR         __EXT_MFC_SAFE_LPCTSTR;
  2403. typedef         TCHAR & __EXT_MFC_SAFE_TCHAR_REF;
  2404. typedef const   TCHAR & __EXT_MFC_SAFE_CONST_TCHAR_REF;
  2405. typedef LPTSTR        & __EXT_MFC_SAFE_LPTSTR_REF;
  2406. typedef LPCTSTR       & __EXT_MFC_SAFE_LPCTSTR_REF;
  2407. typedef TCHAR __prof_uis_used_wchar_t;
  2408. typedef TCHAR __prof_uis_converted_wchar_t;
  2409. typedef CString CExtSafeString;
  2410. #if _MFC_VER >= 0x700
  2411. typedef CStringA CExtSafeStringA; // allways same as MFC's
  2412. typedef CStringW CExtSafeStringW;
  2413. #endif // #if _MFC_VER >= 0x700
  2414. typedef CStringArray          CExtSafeStringArray;
  2415. typedef CStringList           CExtSafeStringList;
  2416. typedef CMapStringToPtr       CExtSafeMapStringToPtr;
  2417. typedef CMapStringToOb        CExtSafeMapStringToOb;
  2418. typedef CMapStringToString    CExtSafeMapStringToString;
  2419. #define  __EXT_MFC_SAFE_ON_WM_DEVMODECHANGE() 
  2420. ON_WM_DEVMODECHANGE()
  2421. #define  __EXT_MFC_SAFE_ON_WM_ASKCBFORMATNAME() 
  2422. ON_WM_ASKCBFORMATNAME()
  2423. #define  __EXT_MFC_SAFE_ON_WM_SETTINGCHANGE() 
  2424. ON_WM_SETTINGCHANGE()
  2425. #define  __EXT_MFC_SAFE_ON_WM_WININICHANGE() 
  2426. ON_WM_WININICHANGE()
  2427. #endif (!defined __EXT_MFC_TEMPLATED_CHARS_IMPLEMENTED)
  2428. #if _MFC_VER >= 0x800
  2429. // rollback warning 4201
  2430. #pragma warning( pop )
  2431. #endif // _MFC_VER >= 0x800
  2432. #endif // __ExtMfcSafeNativeTCHAR_H