Помощь - Поиск - Пользователи - Календарь
Полная версия: 'System::String ^' to 'LPWSTR'
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
sheka
CreateProcess( NULL, this->checkedListBox1->Items[0]->ToString(), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)
error C2664: 'CreateProcessW' : cannot convert parameter 2 from 'System::String ^' to 'LPWSTR'
и что с ним делать?
sheka
Также CreateProcess почему-то отказывается работать с Unicode.
IUnknown
Цитата
и что с ним делать?
PtrToStringChars, чтобы сборщик мусора не прикасался к содержимому строки, и быстро копировать в буфер из wchar_t. Например, через wcscpy или wcscpy_s.

Цитата
Также CreateProcess почему-то отказывается работать с Unicode
Сам проект юникодный? CreateProcessW тоже отказывается?

P.S. Непонятно, зачем столько мучений вместо того, чтобы работать в C#
sheka
STARTUPINFO si;
static PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
CreateProcessW( NULL, TEXT("D:\\Project1.exe"), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi )

при Project->Properties->Character Set->Use Unicode Character Set выдает такую штуку:
Цитата
An unhandled exception of type 'System.AccessViolationException' occurred in PI.exe
Additional information: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.
Думал, что возможно от "static", но во-первых, оно при Not Set работает, а во-вторых, выдает то же самое.

System::String *s = new String(this->checkedListBox1->Items[0]->ToString());
const wchar_t __pin *s = PtrToStringChars(s);
CreateProcess( NULL, s, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi )
Как-то так?
Пишу в VS2005 и такую гадость пишет DragDrop файла
Krjuger
Попробуй вот это
Но это больше костыль,чем нормальное решение)))Но мне помогло пару раз.
IUnknown
Цитата(sheka @ 9.08.2011 12:46) *
Как-то так?
Лучше - вот так:

System::String ^s = gcnew System::String(this->checkedListBox1->Items[0]->ToString());
array<char> ^chArr = s->ToCharArray();
LPWSTR lpArr = new WCHAR[chArray->Length];
System::Runtime::InteropServices::Copy(chArr, 0, IntPtr(lpArr), chArr->Length);
// дальше можно использовать lpArr

// в конце не забываем удалить
delete [] lpArr;
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.