Показать сообщение отдельно
  #12  
Старый 14.04.2013, 13:16
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Для будущих поколений: ссылка к прочтению, и куча инфы о том, как это всё преобразовывать.

Проблема решена.
Обязательным условием должно быть то, что 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 лежит
Код:
puts 'hello world'
Вернуть должно 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);
Ответить с цитированием