令人疯狂的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、付费专栏及课程。

余额充值