最近几天一直在写WTL的一个扩展库,使用的WTL80,完成之后准备改成WTL70/75和WTL80都可以支持的形式,查看WTL的ATLAPP.H定义发现在_WTL_VER在WTL70中定义为0x0700,WTL75定义为0x0750,WTL80中定义为0x0800。WTL80与WTL70/75最大的区别在于使用了ModuleHelper,SecureHelper,RunTimeHelper三个命名空间,除些还有一些增强的功能,并支持Vista。更改的方法就是使用宏进行WTL版本判定:
代码一:
#if
_WTL_VER >= 0x0800
int
nRet
=
::LoadStringA(ModuleHelper::GetResourceInstance(), idCtrl, szBuff, cchBuff);
#else
int
nRet
=
::LoadStringA(_Module.GetResourceInstance(), idCtrl, szBuff,
256
);
#endif
//
_WTL_VER
代码二:
if
_WTL_VER
>=
0x0800
SecureHelper::strncpyA_x(pDispInfo
->
szText, _countof(pDispInfo
->
szText),
&
szBuff[i
+
1
], _TRUNCATE);
#else
lstrcpynA(pDispInfo
->
szText,
&
szBuff[i
+
1
],
sizeof
(pDispInfo
->
szText)
/
sizeof
(pDispInfo
->
szText[
0
]));
#endif
//
_WTL_VER
代码三:
#if
_WTL_VER >= 0x0800

REBARBANDINFO rbbi
=
...
{ RunTimeHelper::SizeOf_REBARBANDINFO() }
;
#else

REBARBANDINFO rbbi
=
...
{0}
;
rbbi.cbSize
=
sizeof
(REBARBANDINFO);
#endif
//
_WTL_VER
代码四:
if
(m_hCursor
==
NULL)

...
{
#if _WTL_VER >= 0x0800
CStaticDataInitCriticalSectionLock lock;
if(FAILED(lock.Lock()))

...{
ATLTRACE2(atlTraceUI, 0, _T("ERROR : Unable to lock critical section in CSplitterImpl::CSplitterImpl. "));
ATLASSERT(FALSE);
return;
}

if(m_hCursor == NULL)
m_hCursor = ::LoadCursor(NULL, t_bVertical ? IDC_SIZEWE : IDC_SIZENS);

lock.Unlock();
#else
::EnterCriticalSection(&_Module.m_csStaticDataInit);
if(m_hCursor == NULL)
m_hCursor = ::LoadCursor(NULL, t_bVertical ? IDC_SIZEWE : IDC_SIZENS);
::LeaveCriticalSection(&_Module.m_csStaticDataInit);
#endif //_WTL_VER
}
诸如此类代码为了适应WTL70/75/80要做许多更改,这个过程让人觉得实在郁闷。最后我发现了下列代码,在WTL70/75有如下定义:
static
BOOL AddSimpleReBarBandCtrl(HWND hWndReBar, HWND hWndBand,
int
nID
=
0
, LPTSTR lpstrTitle
=
NULL, BOOL bNewRow
=
FALSE,
int
cxWidth
=
0
, BOOL bFullWidthAlways
=
FALSE)
在WTL80中重新定义为:
static
BOOL AddSimpleReBarBandCtrl(HWND hWndReBar, HWND hWndBand,
int
nID
=
0
, LPCTSTR lpstrTitle
=
NULL, BOOL bNewRow
=
FALSE,
int
cxWidth
=
0
, BOOL bFullWidthAlways
=
FALSE)
非常好,按上面的方法进行更改即可
#if
_WTL_VER >= 0x0800
BOOL AddSimpleReBarBand(HWND hWndBand, LPCTSTR lpstrTitle
=
NULL, BOOL bNewRow
=
FALSE,
int
cxWidth
=
0
, BOOL bFullWidthAlways
=
FALSE)
#else
BOOL AddSimpleReBarBand(HWND hWndBand, LPTSTR lpstrTitle
=
NULL, BOOL bNewRow
=
FALSE,
int
cxWidth
=
0
, BOOL bFullWidthAlways
=
FALSE)
#endif
//
_WTL_VER

...
{
ATLASSERT(::IsWindow(m_hWndToolBar)); // must be an existing rebar
ATLASSERT(::IsWindow(hWndBand)); // must be created
return CFrameWindowImplBase<>::AddSimpleReBarBandCtrl(m_hWndToolBar, hWndBand, 0, lpstrTitle, bNewRow, cxWidth, bFullWidthAlways);
}
这时候我突然发现在WTL80的若干测试版本中,包括winx1.2附带的WTL80版本中存在以下代码:
static
BOOL AddSimpleReBarBandCtrl(HWND hWndReBar, HWND hWndBand,
int
nID
=
0
, LPTSTR lpstrTitle
=
NULL, BOOL bNewRow
=
FALSE,
int
cxWidth
=
0
, BOOL bFullWidthAlways
=
FALSE)
_WTL_VER已经无效了,我觉得眼前一片黑暗,这真是让人疯狂的WTL,让我彻底崩溃的WTL。