Подтвердить что ты не робот

Как преобразовать строку в LPWSTR в С++

Может ли кто-нибудь помочь в преобразовании string в LPWSTR

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

Теперь я хочу передать его как параметр для CreateProcessW(xx,command,x...)

Но createProcessW() принимает только LPWSTR, поэтому мне нужно передать string в LPWSTR

Спасибо в Advance

4b9b3361

Ответ 1

Если у вас есть строка ANSI, вы считаете, что вместо этого вызывается CreateProcessA? Если есть определенная причина, вам нужно позвонить CreateProcessW, тогда вам нужно будет преобразовать строку. Попробуйте MultiByteToWideChar.

Ответ 2

Самый простой способ преобразовать строку ansi в широкую (unicode) строку - использовать макросы преобразования .

Чтобы использовать их, поставьте USES_CONVERSION в верхней части своей функции, тогда вы можете использовать макросы типа A2W() для простого преобразования.

например.

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

Макросы выделяют пространство в стеке, выполняют преобразование и возвращают преобразованную строку.

Ответ 3

Другой способ:

mbstowcs_s

используйте с string.c_str(), вы можете найти пример здесь или здесь

ИЛИ

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

Ответ 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(), ...);

Обратите внимание, что вместо CreateProcessW или CreateProcessA мы используем CreateProcess. Идея состоит в том, что если UNICODE определено, то TCHAR равно typedef ed до WCHAR, а CreateProcess - #define d, чтобы быть CreateProcessW, которое принимает a LPWSTR; но если UNICODE не определено, то TCHAR становится char, а CreateProcess становится CreateProcessA, которое принимает LPSTR. Но у меня, возможно, нет деталей прямо здесь... этот материал кажется несколько ненужным сложным: (.

Ответ 5

Вы можете сохранить его в CString и вызвать на нем оператор LPWSTR:

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

Обратите внимание, что оператор-оператор WSTR определен только для сборников Unicode.

Ответ 6

Вот еще один вариант. Я использую эту функцию для преобразования.

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

Ответ 7

#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);