Posted on 2007-08-21 23:25
daiybh 阅读(552)
评论(0) 编辑 收藏 引用 所属分类:
vs Studio IDE
今天在VS2005里用到了CReportCtrl 类。
发现 用到 int CReportCtrl::InsertItem(int nIndex, LPCTSTR pszText, ...) 时。如果可变参数个数(LPCTSTR pszText)的小于 开始设置listctrl的列数 则会报错。
几经查看才发现是 va_arg 惹的祸。微软网站上给出了解释,FIX: The va_arg function returns an incorrect value in a Visual C++ 2005 application
文章里说 wait for the next Visual Studio 2005 service pack ,but 我装了sp1 还是有问题,难道是我装的SP有问题。。
在这给出InsertItem实现
int CReportCtrl::InsertItem(int nIndex, LPCTSTR pszText, ...)
{
const int iIndex = CListCtrl::InsertItem(nIndex, pszText);
if (!_IsValidIndex(iIndex))
return iIndex;
CStringArray arr;
arr.Add(pszText);
va_list list;
va_start(list, pszText);
for(int iColumn = 1; iColumn < GetColumnCount(); iColumn++)
{
LPCTSTR lpsz = va_arg(list, LPCTSTR); //在这产生问题。
CString str;
str = (lpsz==NULL)?_T(""):lpsz;
//下面是对上面的展开 否则调试时不能定位到这里
if (lpsz == NULL)
str = _T("") ;
else
str =CString(lpsz);
arr.Add(str);
CListCtrl::SetItemText(iIndex, iColumn, str);
}
va_end(list);
_AssignNewItemData(iIndex, arr.GetData(), arr.GetSize());
return iIndex;
}
有啥办法能解决呢。思考ing......
Technorati : vs2005 va_arg