Для будущих поколений:
ссылка к прочтению, и
куча инфы о том, как это всё преобразовывать.
Проблема решена.
Обязательным условием должно быть то, что lpCommandLine - переменная (write acessable), а не константа. Функцией
Код:
UniqueString(CommandLine);
мы это условие выполняем, а преобразование к PWideChar делаем внутри вызову CreateProcess:
Код:
CreateProcessW(nil, PWideChar(CommandLine), nil, nil, false,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil, nil, si, pi);
Новая проблема: в output и error пусто.
Передаю я ей в качестве CommabdLine следующее:
C:\Ruby200\bin\ruby.exe c:/Uni1.rb
в Unit1.rb лежит
Вернуть должно hello world
Проблема тут:
Код:
Stream := TMemoryStream.Create;
try
while true do
if ReadFile(hPipeOutputRead, szBuffer, 256, dwNumberOfBytesRead, nil)
then
Stream.Write(szBuffer, dwNumberOfBytesRead)
else
break;
Stream.Position := 0;
Output.LoadFromStream(Stream);
finally
Stream.Free;
end;
Внутрь условия не заходит, т.е. ReadFile возвращает False;причина я так думаю всё в тех же
Код:
szBuffer: array [0 .. 256] of Char;
GetLastError вернул
Код:
ERROR_BROKEN_PIPE
109 (0x6D)
The pipe has been ended.
Разобрался! Ошибка означает, что приложение уже закрылось

Т.е. запускать ruby.exe надо с ключём /K
Код:
ExecConsoleApp('cmd /K ruby c:/Unit1.rb', Output, error);