Ответ 1
Если у вас есть строка ANSI, вы считаете, что вместо этого вызывается CreateProcessA
? Если есть определенная причина, вам нужно позвонить CreateProcessW
, тогда вам нужно будет преобразовать строку. Попробуйте MultiByteToWideChar
.
Может ли кто-нибудь помочь в преобразовании string
в LPWSTR
string command=obj.getInstallationPath()+"<some string appended>"
Теперь я хочу передать его как параметр для CreateProcessW(xx,command,x...)
Но createProcessW()
принимает только LPWSTR
, поэтому мне нужно передать string
в LPWSTR
Спасибо в Advance
Если у вас есть строка ANSI, вы считаете, что вместо этого вызывается CreateProcessA
? Если есть определенная причина, вам нужно позвонить CreateProcessW
, тогда вам нужно будет преобразовать строку. Попробуйте MultiByteToWideChar
.
Самый простой способ преобразовать строку ansi в широкую (unicode) строку - использовать макросы преобразования .
Чтобы использовать их, поставьте USES_CONVERSION в верхней части своей функции, тогда вы можете использовать макросы типа A2W() для простого преобразования.
например.
char* sz = "tadaaa";
CreateProcessW(A2W(sz), ...);
Макросы выделяют пространство в стеке, выполняют преобразование и возвращают преобразованную строку.
Другой способ:
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);
}
Кроме того, вы можете рассмотреть возможность использования 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
. Но у меня, возможно, нет деталей прямо здесь... этот материал кажется несколько ненужным сложным: (.
Вы можете сохранить его в CString
и вызвать на нем оператор LPWSTR:
const char* sz = "tadaaa";
const CString s( sz );
LPCWSTR ws = static_cast<LPCWSTR>( s ); //calling CString::operator (LPCWSTR)()const;
Обратите внимание, что оператор-оператор WSTR определен только для сборников Unicode.
Вот еще один вариант. Я использую эту функцию для преобразования.
//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())
#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);