令人疯狂的WTL

   最近几天一直在写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。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值