无法从'std :: string'转换为'LPSTR'

时间:2010-10-11 13:14:10

标签: c++ windows

由于我不能将LPCSTR从一个函数传递到另一个函数(数据被更改),我尝试将其作为字符串传递。

但后来我需要再次将其转换回LPSTR。在尝试转换时,我收到了上述错误:

  

无法从'std :: string'转换为'LPSTR'

我该如何解决这个问题?

6 个答案:

答案 0 :(得分:26)

这只是因为你应该使用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的类型,则类型LPTSTRstd::string不兼容。您应该使用std::wstring代替。

重要说明:如果将结果指针s从上方传递给尝试修改数据的函数,则指向此函数将导致未定义的行为。正确处理它的唯一方法是将字符串复制到非const缓冲区(例如通过strdup

答案 1 :(得分:7)

如果您需要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奖励积分(不要忘记自定义删除器)。

答案 2 :(得分:1)

std::string c_str()上有一个功能。但是我怀疑你不能在你的情况下使用std :: string。

答案 3 :(得分:0)

你在运行somestringvariablename.c_str()吗? 这应该有用。

答案 4 :(得分:0)

LPSTR可以用TCHAR代替(即在tchar.h中找到)。因此,如果你有一个std :: string,你可以使用方法std :: string :: c_str()。

答案 5 :(得分:0)

如果函数,你正在调用不写入字符串,但只读取它,那么你可以简单地使用string :: c_str方法。如果它要写一些东西,那么你可能应该通过调用string :: reserve()来确保你的字符串有足够的空间。