8

我有以下代码块:

for( CarsPool::CarRecord &record : recs->GetRecords())
{
  LVITEM item;
  item.mask = LVIF_TEXT;
  item.cchTextMax = 6;

  item.iSubItem = 0;
  item.pszText = (LPSTR)(record.getCarName().c_str()); //breakpoint on this line.
  item.iItem = 0;
  ListView_InsertItem(CarsListView, &item);

  item.iSubItem = 1; 
  item.pszText = TEXT("Available");
  ListView_SetItem(CarsListView, &item);

  item.iSubItem = 2;
  item.pszText = (LPSTR)CarsPool::EncodeCarType(record.getCarType());
  ListView_SetItem(CarsListView, &item);
}

来自 Visual Studio 调试器的信息在这里:

在此处输入图像描述

为什么程序不能从字符串中读取字符?

测试表明它以这种方式工作:

MessageBox(hWnd, (LPSTR)(record.getCarName().c_str()), "Test", MB_OK);
4

2 回答 2

4

getCarName可能返回一个临时的。分配后临时对象被销毁,指针item.pszText指向无效内存。您必须确保字符串对象在调用ListView_InsertItem.

std::string text(record.getCarName());
item.iSubItem = 0;
item.pszText = const_cast<LPSTR>(text.c_str());
item.iItem = 0;
ListView_InsertItem(CarsListView, &item);

const_cast是 Windows API 使用相同的结构来设置和检索信息这一事实的产物。当调用ListView_InsertItem结构时是不可变的,但是没有办法在语言中反映它。

于 2013-09-22T17:26:51.397 回答
3

看起来您正试图在 C/Win32 调用中使用 C++“字符串”的值。

stdstring.c_str() 是正确的方法。

... 但 ...

您应该将字符串 strcpy() 转换为临时变量,然后使用临时变量进行 Win32 调用。

于 2013-09-22T17:18:00.003 回答