2009-07-29 55 views
11

任何人都可以在转换帮助stringLPWSTR如何转换字符串在C++

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

现在我笏把它作为参数CreateProcessW(xx,command,x...)

createProcessW()到LPWSTR只接受LPWSTR所以我需要投stringLPWSTR

在此先感谢

+1

http://stackoverflow.com/questions/27220/how-to-convert-stdstring-to-lpcwstr-in-c-unicode – 2009-07-29 08:06:48

+1

@ArsenMkrt:这个问题比你指的那个宽。 – xtofl 2009-07-29 08:40:53

回答

12

如果您有ANSI字符串,那么您是否考虑致电CreateProcessA?如果有特定原因需要拨打CreateProcessW,则需要转换字符串。尝试MultiByteToWideChar功能。

1

你可以将其存储在CString并调用LPWSTR操作就可以了:

const char* sz = "tadaaa"; 
const CString s(sz); 
LPCWSTR ws = static_cast<LPCWSTR>(s); //calling CString::operator (LPCWSTR)()const; 

注意,WSTR投运营商只对Unicode的定义版本。

+0

请不要在C++示例代码中使用C风格转换 – 2009-07-29 08:14:23

+0

@mmutsz:你是对的:我们不应该那样做。然而,C风格演员在语法上类似于演员。 – xtofl 2009-07-29 08:23:43

+0

LPCWSTR!= LPWSTR – Cobaia 2012-05-10 19:07:12

5

将ansi字符串转换为宽(unicode)字符串的最简单方法是使用string conversion macros。要使用这些,请将USES_CONVERSION放在函数的顶部,然后可以使用像A2W()这样的宏来轻松执行转换。

例如。

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

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

3

此外,您可能要考虑使用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被定义,则是TCHAR ED typedefWCHARCreateProcess#define d为CreateProcessW,它接受一个LPWSTR;但如果UNICODE未定义,则TCHAR变为char,并且CreateProcess变为CreateProcessA,其接受LPSTR。不过,我可能没有细节就在这里......这东西似乎有点不必要复杂:(

4

另一种方法:

mbstowcs_s 

与string.c_str()的使用,你可以找到例子herehere

OR

USES_CONVERSION_EX; 

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

OR

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

这是另一种选择。我一直在使用这个函数来完成转换。

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

-1
#include "vcclr.h" //for PtrToStringChars 

// Convert function 
LPWSTR S2W(String^ string) { 
    pin_ptr<const wchar_t> wstr = PtrToStringChars(string); 
    return (LPWSTR)wstr; 
} 

// Example 
String^ s = "10.0.0.1"; 
LPWSTR psz = S2W(s);