首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过引用传递LPCWSTR

通过引用传递LPCWSTR
EN

Stack Overflow用户
提问于 2010-11-10 03:34:10
回答 5查看 2.7K关注 0票数 0

我整理了一些我很久以前写的代码,将它放入方法等,当我尝试这样做时,我试图从目录搜索的输入提示中获得输入字符串和LPCWSTR。

代码语言:javascript
复制
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;
}

当我打电话给你

代码语言:javascript
复制
string directoryName;
LPCWSTR directory_Name;
GetInfo(directoryName, directory_Name);

std字符串运行得很好,但是LPCWSTR给我带来了垃圾。它们在方法中都工作得很好,所以我想知道为什么通过引用传递这个字符串会有奇怪的效果?

哦,我还试着写了一个函数,将std::string转换为LPCWSTR,并将变量赋值给它,但这也很奇怪。如果在主体中定义代码,则代码工作得很好,只有在函数内部时才会遇到问题。

谢谢,

弗雷泽

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-11-10 03:41:35

我可以在这段代码中改进几个地方,但您的主要问题是LPCWSTR是一个指向字符串的指针,而不是字符串。您正在为wStr分配一个新的指针值,但是当您的函数返回时,所指向的内存不再有效。

定义UNICODE时,一旦wTemp不再在作用域中,该内存就不再有效。在未定义UNICODE的情况下,指针将不再有效,因为它指向您调用c_str()时包含在stdStr中的数据。当你执行

代码语言:javascript
复制
stdStr = sTempP;

以前返回给您的指针不再被视为有效。

LPCWSTR只是一个用于const wchar_t *的Windows typedef。最好将GetInfo的签名更改为如下所示:

代码语言:javascript
复制
void GetInfo(string &stdStr, wstring &wStr);

并相应地改变代码。假设您需要派生一个LPCWSTR来调用Win32 API函数或其他函数,下面是如何实现的方法:

代码语言:javascript
复制
string directoryName;
wstring directory_Name;
GetInfo(directoryName, directory_Name);
LPCWSTR p_directory_Name = directory_Name.c_str();
票数 3
EN

Stack Overflow用户

发布于 2010-11-10 03:38:26

LPCWSTR只是const wchar_t*__的一个类型定义。

您可以使用std::wstringstd::wstring::c_str()来检索LPCWSTR

此外,如果您愿意,有一种非常简单的方法可以使用专门的boost::lexical_cast外观将std::string转换为std::wstring

票数 0
EN

Stack Overflow用户

发布于 2010-11-10 03:38:31

stdStr = sTempP之后,stdStr.c_str()的结果立即无效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4137672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档