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;
}