函数调用返回ListView_SetItemText宏中的字符串

时间:2011-09-02 11:35:58

标签: c++ winapi

关于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(); 
}

非常感谢

2 个答案:

答案 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是真正的函数调用,那么您的代码将非常安全。)