我整理了一些我很久以前写的代码,将它放入方法等,当我尝试这样做时,我试图从目录搜索的输入提示中获得输入字符串和LPCWSTR。
void GetInfo(string &stdStr, LPCWSTR &wStr)
{
cout << endl << "Enter String: ";
getline(cin, stdStr);
string sTempP = stdStr;
#ifdef UNICODE
std::wstring wTemp = s2ws(stdStr);
wStr = wTemp.c_str();
#else
wStr = stdStr.c_str();
#endif
stdStr = sTempP;
return;
}当我打电话给你
string directoryName;
LPCWSTR directory_Name;
GetInfo(directoryName, directory_Name);std字符串运行得很好,但是LPCWSTR给我带来了垃圾。它们在方法中都工作得很好,所以我想知道为什么通过引用传递这个字符串会有奇怪的效果?
哦,我还试着写了一个函数,将std::string转换为LPCWSTR,并将变量赋值给它,但这也很奇怪。如果在主体中定义代码,则代码工作得很好,只有在函数内部时才会遇到问题。
谢谢,
弗雷泽
发布于 2010-11-10 03:41:35
我可以在这段代码中改进几个地方,但您的主要问题是LPCWSTR是一个指向字符串的指针,而不是字符串。您正在为wStr分配一个新的指针值,但是当您的函数返回时,所指向的内存不再有效。
定义UNICODE时,一旦wTemp不再在作用域中,该内存就不再有效。在未定义UNICODE的情况下,指针将不再有效,因为它指向您调用c_str()时包含在stdStr中的数据。当你执行
stdStr = sTempP;以前返回给您的指针不再被视为有效。
LPCWSTR只是一个用于const wchar_t *的Windows typedef。最好将GetInfo的签名更改为如下所示:
void GetInfo(string &stdStr, wstring &wStr);并相应地改变代码。假设您需要派生一个LPCWSTR来调用Win32 API函数或其他函数,下面是如何实现的方法:
string directoryName;
wstring directory_Name;
GetInfo(directoryName, directory_Name);
LPCWSTR p_directory_Name = directory_Name.c_str();发布于 2010-11-10 03:38:26
LPCWSTR只是const wchar_t*__的一个类型定义。
您可以使用std::wstring和std::wstring::c_str()来检索LPCWSTR。
此外,如果您愿意,有一种非常简单的方法可以使用专门的boost::lexical_cast外观将std::string转换为std::wstring。
发布于 2010-11-10 03:38:31
在stdStr = sTempP之后,stdStr.c_str()的结果立即无效。
https://stackoverflow.com/questions/4137672
复制相似问题