SpTime.cpp
上传用户:zhanglf88
上传日期:2013-11-19
资源大小:6036k
文件大小:16k
源码类别:

金融证券系统

开发平台:

Visual C++

  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. #include "../Include/SpTime.h"
  12. #include <TCHAR.H>
  13. #ifdef AFX_AUX_SEG
  14. #pragma code_seg(AFX_AUX_SEG)
  15. #endif
  16. #ifdef _DEBUG
  17. #undef THIS_FILE
  18. static char THIS_FILE[] = __FILE__;
  19. #endif
  20. /////////////////////////////////////////////////////////////////////////////
  21. // CSPTimeSpan
  22. CSPTimeSpan::CSPTimeSpan()
  23. { }
  24. CSPTimeSpan::CSPTimeSpan(time_t time)
  25. { m_timeSpan = time; }
  26. CSPTimeSpan::CSPTimeSpan(LONG lDays, int nHours, int nMins, int nSecs)
  27. { m_timeSpan = nSecs + 60* (nMins + 60* (nHours + 24* lDays)); }
  28. CSPTimeSpan::CSPTimeSpan(const CSPTimeSpan& timeSpanSrc)
  29. { m_timeSpan = timeSpanSrc.m_timeSpan; }
  30. /////////////////////////////////////////////////////////////////////////////
  31. // CSPTime - absolute time
  32. CSPTime::CSPTime()
  33. { }
  34. CSPTime::CSPTime(time_t time)
  35. { m_time = time; }
  36. CSPTime::CSPTime(const CSPTime& timeSrc)
  37. { m_time = timeSrc.m_time; }
  38. CSPTime::CSPTime(int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec,
  39. int nDST)
  40. {
  41. struct tm atm;
  42. atm.tm_sec = nSec;
  43. atm.tm_min = nMin;
  44. atm.tm_hour = nHour;
  45. SP_ASSERT(nDay >= 1 && nDay <= 31);
  46. atm.tm_mday = nDay;
  47. SP_ASSERT(nMonth >= 1 && nMonth <= 12);
  48. atm.tm_mon = nMonth - 1;        // tm_mon is 0 based
  49. SP_ASSERT(nYear >= 1900);
  50. atm.tm_year = nYear - 1900;     // tm_year is 1900 based
  51. atm.tm_isdst = nDST;
  52. m_time = mktime(&atm);
  53. SP_ASSERT(m_time != -1);       // indicates an illegal input time
  54. if( m_time == -1 )
  55. m_time = ::time(NULL);
  56. }
  57. CSPTime::CSPTime(WORD wDosDate, WORD wDosTime, int nDST)
  58. {
  59. struct tm atm;
  60. atm.tm_sec = (wDosTime & ~0xFFE0) << 1;
  61. atm.tm_min = (wDosTime & ~0xF800) >> 5;
  62. atm.tm_hour = wDosTime >> 11;
  63. atm.tm_mday = wDosDate & ~0xFFE0;
  64. atm.tm_mon = ((wDosDate & ~0xFE00) >> 5) - 1;
  65. atm.tm_year = (wDosDate >> 9) + 80;
  66. atm.tm_isdst = nDST;
  67. m_time = mktime(&atm);
  68. SP_ASSERT(m_time != -1);       // indicates an illegal input time
  69. if( m_time == -1 )
  70. m_time = ::time(NULL);
  71. }
  72. CSPTime::CSPTime(const SYSTEMTIME& sysTime, int nDST)
  73. {
  74. if (sysTime.wYear < 1900)
  75. {
  76. time_t time0 = 0L;
  77. CSPTime timeT(time0);
  78. *this = timeT;
  79. }
  80. else
  81. {
  82. CSPTime timeT(
  83. (int)sysTime.wYear, (int)sysTime.wMonth, (int)sysTime.wDay,
  84. (int)sysTime.wHour, (int)sysTime.wMinute, (int)sysTime.wSecond,
  85. nDST);
  86. *this = timeT;
  87. }
  88. }
  89. CSPTime::CSPTime(const FILETIME& fileTime, int nDST)
  90. {
  91. // first convert file time (UTC time) to local time
  92. FILETIME localTime;
  93. if (!FileTimeToLocalFileTime(&fileTime, &localTime))
  94. {
  95. m_time = 0;
  96. return;
  97. }
  98. // then convert that time to system time
  99. SYSTEMTIME sysTime;
  100. if (!FileTimeToSystemTime(&localTime, &sysTime))
  101. {
  102. m_time = 0;
  103. return;
  104. }
  105. // then convert the system time to a time_t (C-runtime local time)
  106. CSPTime timeT(sysTime, nDST);
  107. *this = timeT;
  108. }
  109. CSPTime PASCAL CSPTime::GetCurrentTime()
  110. // return the current system time
  111. {
  112. return CSPTime(::time(NULL));
  113. }
  114. DWORD CSPTime::GetTradeSecondsOfOneDay( DWORD dwMarket )
  115. {
  116. return 14400;
  117. }
  118. DWORD CSPTime::GetStockTimeNext( DWORD dwDate, int ktype, DWORD dwYear )
  119. {
  120. CSPTime sptime;
  121. if( ktype == CKData::ktypeDay )
  122. {
  123. if( !sptime.FromStockTimeDay( dwDate ) )
  124. return -1;
  125. if( 6 == sptime.GetDayOfWeek() ) // Friday
  126. sptime += CSPTimeSpan(3,0,0,0);
  127. else
  128. sptime += CSPTimeSpan(1,0,0,0);
  129. return sptime.ToStockTimeDay();
  130. }
  131. else if( ktype == CKData::ktypeWeek )
  132. {
  133. if( !sptime.FromStockTimeDay( dwDate ) )
  134. return -1;
  135. sptime += CSPTimeSpan(7,0,0,0);
  136. return sptime.ToStockTimeDay();
  137. }
  138. else if( ktype == CKData::ktypeMonth )
  139. {
  140. if( !sptime.FromStockTimeDay( dwDate ) )
  141. return -1;
  142. int nYearNew = sptime.GetYear();
  143. int nMonthNew = sptime.GetMonth();
  144. nYearNew = ( nMonthNew >= 12 ? nYearNew+1 : nYearNew );
  145. nMonthNew = ( nMonthNew >= 12 ? 1 : nMonthNew+1 );
  146. CSPTime sptime2( nYearNew, nMonthNew, sptime.GetDay(), sptime.GetHour(),sptime.GetMinute(), sptime.GetSecond() );
  147. if( 6 == sptime2.GetDayOfWeek() ) // Friday
  148. sptime2 += CSPTimeSpan(3,0,0,0);
  149. else
  150. sptime2 += CSPTimeSpan(1,0,0,0);
  151. return sptime2.ToStockTimeDay();
  152. }
  153. else if( ktype == CKData::ktypeMin5 )
  154. {
  155. if( !sptime.FromStockTimeMin( dwDate ) )
  156. return -1;
  157. if( sptime.GetHour() == 11 && sptime.GetMinute() >= 25 )
  158. sptime += CSPTimeSpan(0,1,35,0);
  159. else if( sptime.GetHour() == 14 && sptime.GetMinute() >= 55 )
  160. sptime += CSPTimeSpan(0,18,35,0);
  161. else
  162. sptime += CSPTimeSpan(0,0,5,0);
  163. return sptime.ToStockTimeMin();
  164. }
  165. else if( ktype == CKData::ktypeMin15 )
  166. {
  167. if( !sptime.FromStockTimeMin( dwDate ) )
  168. return -1;
  169. if( sptime.GetHour() == 11 && sptime.GetMinute() >= 15 )
  170. sptime += CSPTimeSpan(0,1,45,0);
  171. else if( sptime.GetHour() == 14 && sptime.GetMinute() >= 45 )
  172. sptime += CSPTimeSpan(0,18,45,0);
  173. else
  174. sptime += CSPTimeSpan(0,0,15,0);
  175. return sptime.ToStockTimeMin();
  176. }
  177. else if( ktype == CKData::ktypeMin30 )
  178. {
  179. if( !sptime.FromStockTimeMin( dwDate ) )
  180. return -1;
  181. if( sptime.GetHour() == 11 && sptime.GetMinute() >= 0 )
  182. sptime += CSPTimeSpan(0,2,0,0);
  183. else if( sptime.GetHour() == 14 && sptime.GetMinute() >= 30 )
  184. sptime += CSPTimeSpan(0,19,0,0);
  185. else
  186. sptime += CSPTimeSpan(0,0,30,0);
  187. return sptime.ToStockTimeMin();
  188. }
  189. else if( ktype == CKData::ktypeMin60 )
  190. {
  191. if( !sptime.FromStockTimeMin( dwDate ) )
  192. return -1;
  193. if( (sptime.GetHour() == 10 && sptime.GetMinute() >= 30) || sptime.GetHour() == 11 )
  194. sptime += CSPTimeSpan(0,2,30,0);
  195. else if( sptime.GetHour() == 14 && sptime.GetMinute() >= 0 )
  196. sptime += CSPTimeSpan(0,19,30,0);
  197. else
  198. sptime += CSPTimeSpan(0,1,0,0);
  199. return sptime.ToStockTimeMin();
  200. }
  201. else
  202. {
  203. SP_ASSERT( FALSE );
  204. return -1;
  205. }
  206. }
  207. time_t CSPTime::GetTimeTradeLatest( time_t tmTradeFirstToday )
  208. {
  209. CSPTime tNow = CSPTime::GetCurrentTime();
  210. CSPTime tTradeFirstToday( tmTradeFirstToday );
  211. time_t tmTradeLatest = -1;
  212. int nYear = tTradeFirstToday.GetYear();
  213. int nMonth = tTradeFirstToday.GetMonth();
  214. int nDay = tTradeFirstToday.GetDay();
  215. if( tNow > tTradeFirstToday
  216. && tNow.GetYear() == nYear && tNow.GetMonth() == nMonth && tNow.GetDay() == nDay )
  217. {
  218. tmTradeLatest = tNow.GetTime();
  219. if( (tNow.GetHour() == 11 && tNow.GetMinute() >= 30)
  220. || tNow.GetHour() == 12 )
  221. tmTradeLatest = CSPTime(nYear,nMonth,nDay,11,30,0).GetTime();
  222. else if( tNow.GetHour() >= 15 )
  223. tmTradeLatest = CSPTime(nYear,nMonth,nDay,15,0,0).GetTime();
  224. }
  225. else if( tNow > tTradeFirstToday )
  226. tmTradeLatest = CSPTime(nYear,nMonth,nDay,15,0,0).GetTime();
  227. return tmTradeLatest;
  228. }
  229. double CSPTime::GetTimeTradeRatioOfOneDay( CSPTime tTradeLatestDay, CSPTime tNow )
  230. {
  231. DWORD dwSecOrder = tNow.ToStockTimeSecOrder();
  232. if( 0 == dwSecOrder )
  233. return 1;
  234. if( tTradeLatestDay.GetYear() == tNow.GetYear()
  235. && tTradeLatestDay.GetMonth() == tNow.GetMonth()
  236. && tTradeLatestDay.GetDay() == tNow.GetDay() )
  237. return ((double)dwSecOrder) / GetTradeSecondsOfOneDay();
  238. return 1;
  239. }
  240. time_t CSPTime::GetTradeOffsetToTime( int offset, time_t tmDay)
  241. {
  242. time_t ret = tmDay - ((tmDay+8*3600) % 86400);
  243. if( offset >= 0 && offset <= 120 )
  244. return ret + 9*3600 + (30+offset)*60;
  245. if( offset > 120 && offset <= 240 )
  246. return ret + 13*3600 + (offset-120)*60;
  247. return tmDay;
  248. }
  249. time_t CSPTime::GetLatestTradeTime( time_t tmNow )
  250. {
  251. CSPTime tNow(tmNow);
  252. CSPTime tTradeLatest = tNow;
  253. if( 7 == tNow.GetDayOfWeek() )
  254. {
  255. tNow -= CSPTimeSpan(1,0,0,0);
  256. tTradeLatest = CSPTime(tNow.GetYear(),tNow.GetMonth(),tNow.GetDay(),15,0,0);
  257. }
  258. else if( 1 == tNow.GetDayOfWeek() )
  259. {
  260. tNow -= CSPTimeSpan(2,0,0,0);
  261. tTradeLatest = CSPTime(tNow.GetYear(),tNow.GetMonth(),tNow.GetDay(),15,0,0);
  262. }
  263. else if( (tNow.GetHour() == 9 && tNow.GetMinute() < 25 )
  264. || tNow.GetHour() < 9 )
  265. {
  266. tNow -= CSPTimeSpan(1,0,0,0);
  267. tTradeLatest = CSPTime(tNow.GetYear(),tNow.GetMonth(),tNow.GetDay(),15,0,0);
  268. }
  269. else if( (tNow.GetHour() == 11 && tNow.GetMinute() >= 30)
  270. || tNow.GetHour() == 12 )
  271. {
  272. tTradeLatest = CSPTime(tNow.GetYear(),tNow.GetMonth(),tNow.GetDay(),11,30,0).GetTime();
  273. }
  274. else if( tNow.GetHour() >= 15 )
  275. {
  276. tTradeLatest = CSPTime(tNow.GetYear(),tNow.GetMonth(),tNow.GetDay(),15,0,0).GetTime();
  277. }
  278. return tTradeLatest.GetTime();
  279. }
  280. BOOL CSPTime::InTradeTime( time_t tm, int nInflateSeconds )
  281. {
  282. CSPTime t(tm);
  283. // 周六周日
  284. if( 7 == t.GetDayOfWeek() )
  285. return FALSE;
  286. else if( 1 == t.GetDayOfWeek() )
  287. return FALSE;
  288. time_t day = (t.GetTime()+8*3600) % 86400;
  289. if( day >= 9*3600+25*60-nInflateSeconds && day <= 11*3600+30*60+nInflateSeconds )
  290. return TRUE;
  291. else if( day >= 13*3600-nInflateSeconds && day <= 15*3600+nInflateSeconds )
  292. return TRUE;
  293. return FALSE;
  294. }
  295. BOOL CSPTime::FromStockTimeDay( DWORD date )
  296. {
  297. int nHour = 0;
  298. int nMinute = 0;
  299. int nYear = date / 10000;
  300. int nMonth = (date - nYear*10000)/100;
  301. int nDay = (date - nYear*10000 - nMonth*100);
  302. struct tm atm;
  303. atm.tm_sec = 0;
  304. atm.tm_min = nMinute;
  305. atm.tm_hour = nHour;
  306. if( nDay < 1 || nDay > 31) return FALSE;
  307. atm.tm_mday = nDay;
  308. if( nMonth < 1 && nMonth > 12) return FALSE;
  309. atm.tm_mon = nMonth - 1;        // tm_mon is 0 based
  310. if( nYear < 1900 ) return FALSE;
  311. atm.tm_year = nYear - 1900;     // tm_year is 1900 based
  312. atm.tm_isdst = -1;
  313. time_t tmt = mktime(&atm);
  314. if( tmt == -1 ) // indicates an illegal input time
  315. return FALSE;
  316. *this = CSPTime( nYear, nMonth, nDay, nHour, nMinute, 0 );
  317. return TRUE;
  318. }
  319. BOOL CSPTime::FromStockTimeMin( DWORD date, DWORD year )
  320. {
  321. int nYear = year;
  322. if( -1 == nYear )
  323. nYear = 1990 + date/100000000;
  324. date = date % 100000000;
  325. int nMonth = date/1000000;
  326. int nDay = (date - nMonth*1000000)/10000;
  327. int nHour = (date - nMonth*1000000 - nDay*10000)/100;
  328. int nMinute = (date - nMonth*1000000 - nDay*10000 - nHour*100);
  329. struct tm atm;
  330. atm.tm_sec = 0;
  331. atm.tm_min = nMinute;
  332. atm.tm_hour = nHour;
  333. if( nDay < 1 || nDay > 31) return FALSE;
  334. atm.tm_mday = nDay;
  335. if( nMonth < 1 || nMonth > 12) return FALSE;
  336. atm.tm_mon = nMonth - 1;        // tm_mon is 0 based
  337. if( nYear < 1900 ) return FALSE;
  338. atm.tm_year = nYear - 1900;     // tm_year is 1900 based
  339. atm.tm_isdst = -1;
  340. time_t tmt = mktime(&atm);
  341. if( tmt == -1 ) // indicates an illegal input time
  342. return FALSE;
  343. *this = CSPTime( nYear, nMonth, nDay, nHour, nMinute, 0 );
  344. return TRUE;
  345. }
  346. BOOL CSPTime::FromStockTime( DWORD dwDate, BOOL bDayOrMin, DWORD dwYear )
  347. {
  348. if( bDayOrMin )
  349. return FromStockTimeDay( dwDate );
  350. else
  351. return FromStockTimeMin( dwDate, dwYear );
  352. }
  353. DWORD CSPTime::ToStockTimeDay( )
  354. {
  355. if( -1 == GetTime() || GetTime() < 0 )
  356. return -1;
  357. if( 0 == GetTime() )
  358. return 0;
  359. return ( GetYear() * 10000 + GetMonth() * 100 + GetDay() );
  360. }
  361. DWORD CSPTime::ToStockTimeMin( )
  362. {
  363. if( -1 == GetTime() || GetTime() < 0 )
  364. return -1;
  365. if( 0 == GetTime() )
  366. return 0;
  367. return ( (GetYear() - 1990) * 100000000 + GetMonth() * 1000000 + GetDay() * 10000
  368. + GetHour() * 100 + GetMinute() );
  369. }
  370. DWORD CSPTime::ToStockTimeSecOrder( DWORD dwStockExchange )
  371. {
  372. if( -1 == GetTime() || GetTime() < 0 || 0 == GetTime() )
  373. return 0;
  374. if( GetHour() < 9 || (GetHour() == 9 && GetMinute() < 30) )
  375. return 0;
  376. CSPTime tmStart = CSPTime(GetYear(),GetMonth(),GetDay(),9,30,0);
  377. CSPTime tmEnd = CSPTime(GetYear(),GetMonth(),GetDay(),15,0,0);
  378. if( *this < tmStart )
  379. return 0;
  380. if( *this > tmEnd )
  381. return 14400;
  382. CSPTimeSpan tmSpan = *this - tmStart;
  383. int nSec = tmSpan.GetTotalSeconds();
  384. if( nSec >= 0 && nSec <= 7200 )
  385. return nSec;
  386. if( nSec > 7200 && nSec < 12600 )
  387. return 7200;
  388. if( nSec >= 12600 && nSec <= 19800 )
  389. return nSec-5400;
  390. SP_ASSERT( FALSE );
  391. return 0;
  392. }
  393. DWORD CSPTime::ToStockTime( BOOL bDayOrMin )
  394. {
  395. if( bDayOrMin )
  396. return ToStockTimeDay( );
  397. else
  398. return ToStockTimeMin( );
  399. }
  400. struct tm* CSPTime::GetGmtTm(struct tm* ptm) const
  401. {
  402. if (ptm != NULL)
  403. {
  404. *ptm = *gmtime(&m_time);
  405. return ptm;
  406. }
  407. else
  408. return gmtime(&m_time);
  409. }
  410. struct tm* CSPTime::GetLocalTm(struct tm* ptm) const
  411. {
  412. time_t time_temp = m_time;
  413. if( m_time > 0 )
  414. time_temp = m_time+28800; // 北京时间
  415. if (ptm != NULL)
  416. {
  417. struct tm* ptmTemp = gmtime(&time_temp);
  418. if (ptmTemp == NULL)
  419. return NULL;    // indicates the m_time was not initialized!
  420. *ptm = *ptmTemp;
  421. return ptm;
  422. }
  423. else
  424. return gmtime(&time_temp);
  425. /*
  426. if (ptm != NULL)
  427. {
  428. struct tm* ptmTemp = localtime(&m_time);
  429. if (ptmTemp == NULL)
  430. return NULL;    // indicates the m_time was not initialized!
  431. *ptm = *ptmTemp;
  432. return ptm;
  433. }
  434. else
  435. return localtime(&m_time);
  436. */
  437. }
  438. BOOL CSPTime::GetAsSystemTime(SYSTEMTIME& timeDest) const
  439. {
  440. struct tm* ptm = GetLocalTm(NULL);
  441. if (ptm == NULL)
  442. return FALSE;
  443. timeDest.wYear = (WORD) (1900 + ptm->tm_year);
  444. timeDest.wMonth = (WORD) (1 + ptm->tm_mon);
  445. timeDest.wDayOfWeek = (WORD) ptm->tm_wday;
  446. timeDest.wDay = (WORD) ptm->tm_mday;
  447. timeDest.wHour = (WORD) ptm->tm_hour;
  448. timeDest.wMinute = (WORD) ptm->tm_min;
  449. timeDest.wSecond = (WORD) ptm->tm_sec;
  450. timeDest.wMilliseconds = 0;
  451. return TRUE;
  452. }
  453. /////////////////////////////////////////////////////////////////////////////
  454. // String formatting
  455. #define maxTimeBufferSize       128
  456. // Verifies will fail if the needed buffer size is too large
  457. #ifdef _UNICODE
  458. #endif
  459. CSPString CSPTimeSpan::Format(LPCTSTR pFormat) const
  460. // formatting timespans is a little trickier than formatting CSPTimes
  461. //  * we are only interested in relative time formats, ie. it is illegal
  462. //      to format anything dealing with absolute time (i.e. years, months,
  463. //         day of week, day of year, timezones, ...)
  464. //  * the only valid formats:
  465. //      %D - # of days -- NEW !!!
  466. //      %H - hour in 24 hour format
  467. //      %M - minute (0-59)
  468. //      %S - seconds (0-59)
  469. //      %% - percent sign
  470. {
  471. TCHAR szBuffer[maxTimeBufferSize];
  472. TCHAR ch;
  473. LPTSTR pch = szBuffer;
  474. while ((ch = *pFormat++) != '')
  475. {
  476. SP_ASSERT(pch < &szBuffer[maxTimeBufferSize]);
  477. if (ch == '%')
  478. {
  479. switch (ch = *pFormat++)
  480. {
  481. default:
  482. SP_ASSERT(FALSE);      // probably a bad format character
  483. case '%':
  484. *pch++ = ch;
  485. break;
  486. case 'D':
  487. pch += wsprintf(pch, _T("%ld"), GetDays());
  488. break;
  489. case 'H':
  490. pch += wsprintf(pch, _T("%02d"), GetHours());
  491. break;
  492. case 'M':
  493. pch += wsprintf(pch, _T("%02d"), GetMinutes());
  494. break;
  495. case 'S':
  496. pch += wsprintf(pch, _T("%02d"), GetSeconds());
  497. break;
  498. }
  499. }
  500. else
  501. {
  502. *pch++ = ch;
  503. if (_istlead(ch))
  504. {
  505. SP_ASSERT(pch < &szBuffer[maxTimeBufferSize]);
  506. *pch++ = *pFormat++;
  507. }
  508. }
  509. }
  510. *pch = '';
  511. return szBuffer;
  512. }
  513. CSPString CSPTime::Format(LPCTSTR pFormat) const
  514. {
  515. TCHAR szBuffer[maxTimeBufferSize];
  516. struct tm* ptmTemp = localtime(&m_time);
  517. if (ptmTemp == NULL ||
  518. !_tcsftime(szBuffer, sizeof(szBuffer), pFormat, ptmTemp))
  519. szBuffer[0] = '';
  520. return szBuffer;
  521. }
  522. CSPString CSPTime::FormatGmt(LPCTSTR pFormat) const
  523. {
  524. TCHAR szBuffer[maxTimeBufferSize];
  525. struct tm* ptmTemp = gmtime(&m_time);
  526. if (ptmTemp == NULL ||
  527. !_tcsftime(szBuffer, sizeof(szBuffer), pFormat, ptmTemp))
  528. szBuffer[0] = '';
  529. return szBuffer;
  530. }
  531. #ifdef _UNICODE
  532. // These functions are provided for compatibility with MFC 3.x
  533. CSPString CSPTime::Format(LPCSTR pFormat) const
  534. {
  535. CSPString strFormat(pFormat);
  536. return Format((LPCTSTR)strFormat);
  537. }
  538. CSPString CSPTime::FormatGmt(LPCSTR pFormat) const
  539. {
  540. CSPString strFormat(pFormat);
  541. return FormatGmt((LPCTSTR)strFormat);
  542. }
  543. CSPString CSPTimeSpan::Format(LPCSTR pFormat) const
  544. {
  545. CSPString strFormat = pFormat;
  546. return Format((LPCTSTR)strFormat);
  547. }
  548. #endif // _UNICODE
  549. /////////////////////////////////////////////////////////////////////////////