невозможно преобразовать из 'std :: string' в 'LPSTR' - PullRequest
20 голосов
/ 11 октября 2010

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

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

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

Как мне решить эту проблему?

Ответы [ 6 ]

26 голосов
/ 11 октября 2010

Это просто потому, что вы должны использовать 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 сверху функции, которая пытается изменить данные, на которые она указывает, это приведет к неопределенному поведению. Единственный способ правильно с этим справиться - скопировать строку в неконстантный буфер (например, через strdup)

7 голосов
/ 11 октября 2010

Если вам нужен 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 для бонусных очков (не забудьте пользовательский удалитель).

1 голос
/ 11 октября 2010

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

0 голосов
/ 11 октября 2010

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

0 голосов
/ 11 октября 2010

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

0 голосов
/ 11 октября 2010

Ты бежишь somestringvariablename.c_str()?Это должно сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...