我有以下代码块:
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中的信息位于:
为什么程序不能从字符串中读取字符?
测试告诉我它以这种方式工作:
MessageBox(hWnd, (LPSTR)(record.getCarName().c_str()), "Test", MB_OK);
答案 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调用。