- 读取字符串的错误字符

时间:2013-09-22 17:07:03

标签: c++ winapi

我有以下代码块:

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 Debugger中的信息位于:

enter image description here

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

测试告诉我它以这种方式工作:

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

2 个答案:

答案 0 :(得分: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时,结构是不可变的,但是没有办法在语言中反映出来。

答案 1 :(得分:3)

看起来你正试图在C / Win32调用中使用C ++“string”的值。

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

......但是......

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