Подтвердить что ты не робот

Не может конвертировать из 'std::string' в 'LPSTR'

Поскольку я не мог передать LPCSTR из одной функции в другую (Data get changed), я попытался передать его как строку.

Но позже мне нужно снова преобразовать его в LPSTR. При попытке преобразования я получаю ошибку выше:

не может преобразовать из 'std::string' в 'LPSTR'

Как я могу это решить?

4b9b3361

Ответ 1

Это просто потому, что вы должны использовать метод std::string::c_str().

Но это связано с const_cast в данном случае, потому что const char *, возвращаемый c_str(), не может быть назначен непостоянному LPSTR.

std::string str = "something";
LPSTR s = const_cast<char *>(str.c_str());

Но вы должны быть уверены, что время жизни str будет больше, чем время переменной LPTSTR.

Еще одно упоминание, если код компилируется как Unicode-совместимый, то типы LPTSTR и std::string несовместимы. Вместо этого вы должны использовать std::wstring.

Важное примечание: Если вы передадите результирующий указатель s сверху функции, которая пытается изменить данные, указывающие на это, приведет к поведению undefined. Единственный способ справиться с этим - дублировать строку в неконстантный буфер (например, через strdup)

Ответ 2

Если вам нужен LPSTR, это означает, что строка будет/может быть изменена. std::string::c_str() возвращает указатель const, и вы не можете просто const_cast удалить его и надеяться, что все будет хорошо в мире, потому что это не так. Строка может быть изменена всякими неприятными способами, и ваш оригинальный std::string будет не обращать внимания на все из них.

Попробуйте это вместо:

// myFunction takes an LPSTR
std::string cppString = "something";
LPSTR cString = strdup( cppString.c_str() );
try {
   myFunction( cString );
   cppString = cString;
} catch(...) {
   free( cString );
}

Оберните строку в умный указатель и избавьтесь от try...catch для бонусных очков (не забывайте, что пользовательский делетер).

Ответ 3

Существует функция std::string c_str(). Однако я сомневаюсь, что вы не могли использовать std::string в вашем случае.

Ответ 4

Вы используете somestringvariablename.c_str()? Это должно работать.

Ответ 5

LPSTR можно заменить с помощью TCHAR (т.е. найденного в tchar.h). Поэтому, если у вас есть std::string, вы можете использовать метод std::string:: c_str().

Ответ 6

Если функция, которую вы вызываете, не записывается в строку, а только читает ее, то вы можете просто использовать метод string:: c_str. Если он что-то собирается написать, вы, вероятно, должны убедиться, что ваша строка имеет достаточно места, вызывая string:: reserve().