Не может конвертировать из 'std::string' в 'LPSTR'
Поскольку я не мог передать LPCSTR из одной функции в другую (Data get changed), я попытался передать его как строку.
Но позже мне нужно снова преобразовать его в LPSTR. При попытке преобразования я получаю ошибку выше:
не может преобразовать из 'std::string' в 'LPSTR'
Как я могу это решить?
Ответы
Ответ 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().