关于ListView_SetItemText宏的问题,用于设置ListView Windows控件中项目的文本。 为什么以下代码有效(在某种意义上,文本显示在ListView中)
std::string strNumber = NumberToString(number);
ListView_SetItemText( hListView, iItemIndex, iSubitemIndex, (LPSTR)strNumber.c_str() );
直接通话时
ListView_SetItemText( hListView, iItemIndex, iSubitemIndex, (LPSTR)NumberToString(number).c_str() );
,其中
std::string NumberToString ( double Number )
{
std::ostringstream ss;
ss << Number;
return ss.str();
}
非常感谢
答案 0 :(得分:0)
您在指向变量strNumber的指针中发送的第一个调用。
在第二次调用中,您将指向函数返回值的指针发送,该函数在调用后未定义。
答案 1 :(得分:0)
这是宏定义(在commctrl.h
中):
#define ListView_SetItemText(w,i,iS,s) \
{ \
LV_ITEM _lvi;\
_lvi.iSubItem=iS;\
_lvi.pszText=s;\
SNDMSG((w),LVM_SETITEMTEXT,i,(LPARAM)(LV_ITEM*)&_lvi);\
}
这扩展为:
...
_lvi.pszText=(LPSTR)NumberToString(number).c_str();
SNDMSG((hListView),LVM_SETITEMTEXT,iItemIndex,(LPARAM)(LV_ITEM*)&_lvi);
}
NumberToString
函数返回临时 std::string
,在SNDMSG
调用之前将其删除。所以_lvi.pszText
指向空气稀薄。 (如果ListView_SetItemText
是真正的函数调用,那么您的代码将非常安全。)