C ++ - 在字符串和LPCWSTR之间转换[重复]

时间:2022-02-26 16:38:25

This question already has an answer here:

这个问题在这里已有答案:

I am trying to write a function to convert a string to a LPCWSTR. Here's what I have:

我正在尝试编写一个函数来将字符串转换为LPCWSTR。这就是我所拥有的:

LPCWSTR stoLPCWSTR(string str)
{
    wstring w(str.begin(), str.end());
    return w.c_str();
}

I've run this code with debugging, and at the return line, the transmitted string sits safely in w. However, when it returns, it looks something like this:

我已经通过调试运行此代码,并且在返回行,传输的字符串安全地位于w中。但是,当它返回时,它看起来像这样:

"ﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮﻮꑯ䎕骙ᰀ䪀ɽ绐ɽ▼ཛĖ"

...so basically, garbage. What am I doing wrong?

......所以基本上,垃圾。我究竟做错了什么?

2 个解决方案

#1


2  

Your wide string, w, goes out of scope at the end of the function and is destroyed.

你的宽字符串w在函数末尾超出范围并被销毁。

The value returned by c_str() no longer points to valid data.

c_str()返回的值不再指向有效数据。

Return the wide-string instead, and use c_str() on it only at the location it is needed.

改为返回宽字符串,并仅在需要的位置使用c_str()。

wstring stows(string str)
{
    return wstring(str.begin(), str.end());
}

//...

wstring ws = stows("hello");

api_call_needing_LPCWSTR(ws.c_str());

#2


2  

You're retuning unallocated memory here; the wstring has gone out of scope and you're returning a pointer to it. That's why you get rubbish.

你在这里重新调整未分配的内存; wstring已超出范围,您将返回指向它的指针。这就是你得到垃圾的原因。

#1


2  

Your wide string, w, goes out of scope at the end of the function and is destroyed.

你的宽字符串w在函数末尾超出范围并被销毁。

The value returned by c_str() no longer points to valid data.

c_str()返回的值不再指向有效数据。

Return the wide-string instead, and use c_str() on it only at the location it is needed.

改为返回宽字符串,并仅在需要的位置使用c_str()。

wstring stows(string str)
{
    return wstring(str.begin(), str.end());
}

//...

wstring ws = stows("hello");

api_call_needing_LPCWSTR(ws.c_str());

#2


2  

You're retuning unallocated memory here; the wstring has gone out of scope and you're returning a pointer to it. That's why you get rubbish.

你在这里重新调整未分配的内存; wstring已超出范围,您将返回指向它的指针。这就是你得到垃圾的原因。