春暖花开
雪化了,花开了,春天来了
posts - 149,comments - 125,trackbacks - 0

LoadString的一些小用法中, 谈到了对LoadString的一点用法,万连文指出这个方法解决不够彻底,听取了他的意见,我参考了一下vc的CString的LoadString的写法.
具体在VC98\MFC\SRC\WINSTR.CPP这个文件中,我也贴出来一部分:

#ifdef _UNICODE
#define CHAR_FUDGE 1    // one TCHAR unused is good enough
#else
#define CHAR_FUDGE 2    // two BYTES unused for case of DBC last char
#endif

BOOL CString::LoadString(UINT nID)
{
    
// try fixed buffer first (to avoid wasting space in the heap)
    TCHAR szTemp[256];
    
int nLen = AfxLoadString(nID, szTemp, _countof(szTemp));
    
if (_countof(szTemp) - nLen > CHAR_FUDGE)
    
{
        
*this = szTemp;
        
return nLen > 0;
    }


    
// try buffer size of 512, then larger size until entire string is retrieved
    int nSize = 256;
    
do
    
{
        nSize 
+= 256;
        nLen 
= AfxLoadString(nID, GetBuffer(nSize-1), nSize);
    }
 while (nSize - nLen <= CHAR_FUDGE);
    ReleaseBuffer();

    
return nLen > 0;
}


#ifndef _AFXDLL
int AFXAPI AfxLoadString(UINT nID, LPTSTR lpszBuf, UINT nMaxBuf)
{
    ASSERT(AfxIsValidAddress(lpszBuf, nMaxBuf
*sizeof(TCHAR)));
#ifdef _DEBUG
    
// LoadString without annoying warning from the Debug kernel if the
    
//  segment containing the string is not present
    if (::FindResource(AfxGetResourceHandle(),
       MAKEINTRESOURCE((nID
>>4)+1), RT_STRING) == NULL)
    
{
        lpszBuf[
0= '\0';
        
return 0// not found
    }

#endif //_DEBUG
    
int nLen = ::LoadString(AfxGetResourceHandle(), nID, lpszBuf, nMaxBuf);
    
if (nLen == 0)
        lpszBuf[
0= '\0';
    
return nLen;
}

#endif

这段代码写的挺精妙的.
posted on 2008-12-18 19:35 Sandy 阅读(3834) 评论(1)  编辑 收藏 引用 所属分类: windows学习

FeedBack:
# re: 再谈LoadString
2008-12-18 20:05 | Sandy
仔细想了想,如果用上面这个方法,势必要用到动态分配字符串数组,我不是很熟悉字符串数组如何实现动态增长.(如果有大侠知道的话,请指点一二).如果是采用New和Delete的话,则需要不断的New和Delete,可能这个显示中的概率比较小,string table里面字符串的长度也是有限制的.但这个方法确保了不会出现异常.
而我昨天所用的LoadString(hInstance, IDS_STR, NULL, 0),则可能会不稳定.需要人为的去进行设置一下.

所以个人认为,如果知道字符串的大概长度的话,这两种方法都不可取,如果你资源的文件可能涉及多语言和国际化的话,就需要考虑一下这两种方法.
采取哪种,看你了
  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理