C++ 如何在c++;

C++ 如何在c++;,c++,visual-c++,C++,Visual C++,有人能帮忙把string转换成LPWSTR string command=obj.getInstallationPath()+"<some string appended>" string命令=obj.getInstallationPath()+“” 现在我想把它作为参数传递给CreateProcessW(xx,command,x…) 但是createProcessW()只接受LPWSTR,所以我需要将string转换为LPWSTR string command=obj.ge

有人能帮忙把
string
转换成
LPWSTR

string command=obj.getInstallationPath()+"<some string appended>"  
string命令=obj.getInstallationPath()+“”
现在我想把它作为参数传递给
CreateProcessW(xx,command,x…)

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

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

提前感谢

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

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

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

例如


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

,也可以考虑使用<代码> 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(), ...);
typedef std::basic_string tstring
//使您控制的任何方法返回tstring值。因此,你可以写:
tstring命令=obj.getInstallationPath();
CreateProcess(x,command.c_str(),…);
请注意,我们使用
CreateProcess
而不是
CreateProcessW
CreateProcessA
。其思想是,如果定义了
UNICODE
,那么
TCHAR
就是
typedef
ed到
WCHAR
CreateProcess
就是
,定义
d为
CreateProcessW
,它接受
LPWSTR
;但如果未定义
UNICODE
,则
TCHAR
变为
char
CreateProcess
变为
CreateProcessA
,它接受
LPSTR
。但我可能没有这里的细节。。。这些东西似乎有些不必要的复杂:(.

另一种方式:

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


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

//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())

@ArsenMkrt:这个问题比你提到的问题更广泛。你提到的文档还说你不需要ATL7.0及更高版本的USES_转换。是的,但我已经使用了这么久,我自动添加了:)这和@gbjbaanb的答案不一样吗?为了让它工作,我不得不对它做一些修改:ccombstrdomain(csDomain);LPWSTR pszServerName=bstrDomain;NetWkstaGetInfo(pszServerName、dwLevel、(LPBYTE*)和pBuf)
SysFreeString
释放内存,无法使用
lp
afterwards@MattMcNabb添加了您的考虑。同意,我一直使用tchar进行此类操作。仅使用tchar转换古老的windows软件。唯一有充分理由继续使用它的是microsoft文档编写器,当它们同时具有A和W函数时。如果出现异常,它将创建内存泄漏。@Jonathan内存泄漏可以通过使用
std::vector buf(len)修复
而不是
新的
行。还有一个问题,如果
s.size()>INT_MAX-1
你最多只能得到虚假的结果;为了使这个函数健壮,它应该检查并抛出一个异常或采取一些其他定义良好的操作
{
    std::string str = "String to LPWSTR";
    BSTR b = _com_util::ConvertStringToBSTR(str.c_str());
    LPWSTR lp = b;
    Use lp before SysFreeString...
    SysFreeString(b);
}
//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;
}