【问题标题】:How to convert string to LPWSTR in c++如何在 C++ 中将字符串转换为 LPWSTR
【发布时间】:2010-11-14 23:33:55
【问题描述】:

谁能帮忙把string转换成LPWSTR

string command=obj.getInstallationPath()+"<some string appended>"  

现在我要把它作为参数传递给CreateProcessW(xx,command,x...)

但是createProcessW() 只接受LPWSTR 所以我需要将string 转换为LPWSTR

提前致谢

【问题讨论】:

标签: c++ visual-c++


【解决方案1】:

将 ansi 字符串转换为宽(unicode)字符串的最简单方法是使用string conversion macros

要使用这些,请将 USES_CONVERSION 放在函数的顶部,然后您可以使用 A2W() 之类的宏来非常轻松地执行转换。

例如。

char* sz = "tadaaa";
CreateProcessW(A2W(sz), ...);

宏在堆栈上分配空间,执行转换并返回转换后的字符串。

【讨论】:

  • 您参考的文档还说您不需要 ATL7.0 及更高版本的USES_CONVERSION。
  • 是的,但我已经使用了很长时间,我自动添加了它:)
【解决方案2】:

另一种方式:

mbstowcs_s

与 string.c_str() 一起使用,您可以找到示例 herehere

USES_CONVERSION_EX;

std::string text = "text";
LPWSTR lp = A2W_EX(text.c_str(), text.length());

{
    std::string str = "String to LPWSTR";
    BSTR b = _com_util::ConvertStringToBSTR(str.c_str());
    LPWSTR lp = b;
    Use lp before SysFreeString...
    SysFreeString(b);
}

【讨论】:

  • 这不是和@gbjbaanb 的回答一样吗? stackoverflow.com/a/1198822/6610
  • 我必须对其进行一些更改才能使其正常工作:CComBSTR bstrDomain(csDomain); LPWSTR pszServerName = bstrDomain; NetWkstaGetInfo(pszServerName,dwLevel,(LPBYTE *)&pBuf);
  • SysFreeString 释放内存,之后不能使用lp
  • @MattMcNabb 添加了您的考虑。
【解决方案3】:

这是另一种选择。我一直在使用这个函数进行转换。

//C++ string to WINDOWS UNICODE string
std::wstring s2ws(const std::string& s)
{
   int len;
   int slength = (int)s.length() + 1;
   len = MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, 0, 0); 
   wchar_t* buf = new wchar_t[len];
   MultiByteToWideChar(CP_ACP, 0, s.c_str(), slength, buf, len);
   std::wstring r(buf);
   delete[] buf;
   return r;
}

然后像这样包装你的字符串。 s2ws(volume.c_str())

【讨论】:

  • 如果有异常,就会造成内存泄漏。
  • @Jonathan 内存泄漏可以通过使用std::vector&lt;wchar_t&gt; buf(len);而不是new这一行来修复。
  • 还有一个问题,如果s.size() &gt; INT_MAX - 1 充其量你会得到虚假的结果;为了使这个函数健壮,它应该检查并抛出异常或采取其他一些明确定义的操作
【解决方案4】:

另外,您可能需要考虑在整个过程中使用TCHAR...如果我是正确的,那么这个想法应该是这样的:

typedef std::basic_string<TCHAR> tstring

// Make any methods you control return tstring values. Thus, you could write:
tstring command = obj.getInstallationPath();
CreateProcess(x, command.c_str(), ...);

请注意,我们使用CreateProcess 而不是CreateProcessWCreateProcessA。这个想法是,如果定义了UNICODE,那么TCHARtypedefed 到WCHARCreateProcess#defined 是CreateProcessW,它接受一个LPWSTR;但如果 UNICODE 未定义,则 TCHAR 变为 charCreateProcess 变为 CreateProcessA,它接受 LPSTR。但我可能没有这里的细节......这些东西似乎有些不必要的复杂:(。

【讨论】:

  • 同意,我总是用 tchar 来做这种事情。
  • 只能使用TCHAR转换古windows软件。唯一有充分理由继续使用它的是 microsoft 文档编写者,因为他们同时具有 A 和 W 功能。
【解决方案5】:

如果您有一个 ANSI 字符串,那么您是否考虑过调用 CreateProcessA 来代替?如果有特定原因需要调用CreateProcessW,则需要转换字符串。试试MultiByteToWideChar 函数。

【讨论】:

    猜你喜欢
    • 2012-09-09
    • 1970-01-01
    • 2014-07-31
    • 1970-01-01
    • 2022-10-05
    • 2023-03-24
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    相关资源
    最近更新 更多