IIf является фактической функцией, таким образом, все аргументы оценены. , Если ключевое слово было добавлено к VB.NET 2008 для обеспечения функциональности короткого замыкания, Вы ожидаете.
Попытка
logLine = "e.Value: " + If(e.Value Is Nothing, "", e.Value.ToString())
Самый простой способ преобразовать строку ansi в широкую строку (unicode) - использовать макрос преобразования строки .
Чтобы использовать их, поместите USES_CONVERSION в начало вашей функции, затем вы можете использовать макросы, такие как A2W (), для очень простого выполнения преобразования.
например.
char* sz = "tadaaa";
CreateProcessW(A2W(sz), ...);
Макросы выделяют место в стеке, выполняют преобразование и вернуть преобразованную строку.
Если у вас есть строка ANSI, подумывали ли вы о вызове CreateProcessA
вместо этого? Если есть особая причина, по которой вам нужно вызвать CreateProcessW
, тогда вам нужно будет преобразовать строку. Попробуйте функцию MultiByteToWideChar
.
Кроме того, вы можете подумать об использовании 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
вместо CreateProcessW
или CreateProcessA
. Идея состоит в том, что если UNICODE
определен, то TCHAR
будет typedef
отредактирован до WCHAR
, а CreateProcess
будет #define
d должен быть CreateProcessW
, который принимает LPWSTR
; но если UNICODE
не определен, то TCHAR
становится char
, а CreateProcess
становится CreateProcessA
, который принимает LPSTR
.
Вы можете сохранить его в a CString
и вызовите для него оператор LPWSTR:
const char* sz = "tadaaa";
const CString s( sz );
LPCWSTR ws = static_cast<LPCWSTR>( s ); //calling CString::operator (LPCWSTR)()const;
Обратите внимание, что оператор приведения WSTR определен только для сборок Unicode.