-Error leer caracteres de cadena

Tengo el siguiente bloque de código:

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); } 

La información de Visual Studio Debugger está aquí:

introduzca la descripción de la imagen aquí

¿Por qué el progtwig no puede leer los caracteres de la cadena?

Una prueba me ha demostrado que funciona de esta manera:

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

getCarName probablemente devuelve un temporal. Después de la asignación, el objeto temporal se destruye y el puntero item.pszText apunta a una memoria no válida. Debe asegurarse de que el objeto de cadena sea válido durante la llamada a ListView_InsertItem .

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

El const_cast es un artefacto del hecho de que la API de Windows usa la misma estructura para establecer y recuperar información. Cuando se invoca a ListView_InsertItem la estructura es inmutable, sin embargo, no hay manera de reflejar eso en el lenguaje.

Parece que estás intentando usar el valor de una “cadena” de C ++ en una llamada C / Win32.

stdstring.c_str () es la forma correcta de hacerlo.

… PERO …

Debería colocar la cadena () en una variable temporal, luego hacer la llamada a Win32 con la variable temporal.