2009-07-29 28 views
11

bất cứ ai có thể giúp đỡ trong việc chuyển đổi string để LPWSTRLàm thế nào để chuyển đổi chuỗi để LPWSTR trong C++

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

Bây giờ tôi wat để vượt qua nó như là tham số cho CreateProcessW(xx,command,x...)

Nhưng createProcessW() chỉ chấp nhận LPWSTR vì vậy tôi cần phải cast string đến LPWSTR

Cảm ơn trước Advance

+1

http://stackoverflow.com/questions/27220/how-to-convert-stdstring-to-lpcwstr-in-c-unicode –

+1

@ArsenMkrt: câu hỏi này rộng hơn cái bạn đề cập đến. – xtofl

Trả lời

12

Nếu bạn có một chuỗi ANSI, thì bạn có cân nhắc gọi số CreateProcessA thay thế không? Nếu có lý do cụ thể bạn cần gọi CreateProcessW thì bạn sẽ cần phải chuyển đổi chuỗi. Hãy thử chức năng MultiByteToWideChar.

1

Bạn có thể lưu trữ nó trong một CString và gọi tổng đài LPWSTR vào nó:

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

Lưu ý rằng các nhà điều hành cast WSTR chỉ định nghĩa cho unicode xây dựng.

+0

xin vui lòng không sử dụng phôi kiểu C trong mã mẫu C++ –

+0

@mmutsz: bạn nói đúng: chúng ta không nên làm điều đó. Tuy nhiên, kiểu đúc theo kiểu C tương tự như toán tử cast. – xtofl

+0

LPCWSTR! = LPWSTR – Cobaia

5

Cách dễ nhất để chuyển đổi chuỗi ansi thành chuỗi (unicode) rộng là sử dụng string conversion macros.

Để sử dụng, hãy đặt USES_CONVERSION ở đầu chức năng của bạn, sau đó bạn có thể sử dụng các macro như A2W() để thực hiện chuyển đổi rất dễ dàng.

ví dụ:

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

Macro phân bổ không gian trên ngăn xếp, thực hiện chuyển đổi và trả về chuỗi đã chuyển đổi.

+0

Tài liệu bạn tham khảo cũng cho biết bạn không cần USES_CONVERSION cho ATL7.0 trở lên. – xtofl

+0

vâng, nhưng tôi đã sử dụng nó quá lâu Tôi thêm tự động :) – gbjbaanb

3

Ngoài ra, bạn có thể muốn xem xét sử dụng TCHAR suốt ... Nếu tôi đúng, ý tưởng sẽ là một cái gì đó như thế này:

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(), ...); 

Lưu ý rằng chúng tôi sử dụng CreateProcess thay vì CreateProcessW hoặc CreateProcessA. Ý tưởng là nếu UNICODE được xác định, sau đó TCHARtypedef ed để WCHARCreateProcess#define d là CreateProcessW, mà chấp nhận một LPWSTR; nhưng nếu không xác định được UNICODE thì TCHAR sẽ trở thành charCreateProcess trở thành CreateProcessA, chấp nhận LPSTR. Nhưng tôi có thể không có các chi tiết ngay tại đây ... công cụ này dường như hơi không cần thiết phức tạp :(

+0

Đồng ý, tôi luôn luôn sử dụng tchar cho loại điều. – derpface

+1

Chỉ sử dụng TCHAR để chuyển đổi phần mềm cửa sổ cổ. Những người duy nhất có lý do chính đáng để tiếp tục sử dụng nó là các nhà văn tài liệu microsoft, khi họ có cả hàm A và W. – Deduplicator

4

Một cách khác:.

mbstowcs_s 

sử dụng với string.c_str(), bạn có thể tìm thấy ví dụ here hoặc here

HOẶC

USES_CONVERSION_EX; 

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

HOẶC

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

Đó không phải là điều tương tự như trong câu trả lời của @ gbjbaanb? http://stackoverflow.com/a/1198822/6610 – xtofl

+0

Tôi đã phải thay đổi nó một chút để làm cho nó hoạt động: CComBSTR bstrDomain (csDomain); LPWSTR pszServerName = bstrDomain; NetWkstaGetInfo (pszServerName, dwLevel, (LPBYTE *) &pBuf); –

+0

'SysFreeString' deallocates bộ nhớ, bạn không thể sử dụng 'lp' sau –

1

Đây là một tùy chọn khác.Tôi đã sử dụng chức năng này để thực hiện chuyển đổi.

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

Và quấn chuỗi của bạn như thế này. s2ws (volume.c_str())

+0

Nếu có một ngoại lệ, nó sẽ tạo ra một sự rò rỉ bộ nhớ. – Jonathan

+0

@ Jonathan Rò rỉ bộ nhớ có thể được sửa bằng cách sử dụng 'std :: vector buf (len);' thay vì dòng 'mới'. –

+0

cũng có vấn đề nếu' s.size()> INT_MAX - 1' bạn ' sẽ có được kết quả không có thật tốt nhất, để làm cho chức năng này mạnh mẽ, nó nên kiểm tra và ném một ngoại lệ hoặc thực hiện một số hành động được xác định rõ ràng khác –

-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); 
Các vấn đề liên quan