![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
![]() Ребят, только не бросайтесь фразами: "А уже дофига всяких IDE, зачем тратить время, силы бла бла бла всё равно лучше не сделаешь"
Я для себя. Просто хочу разобраться как эти программы работают. Значит проблема следующая: как отдать файл компилятору (интерпретатору), и вернуть результат в виде ошибок, если они есть. Я так понимаю командная строка + CreateProcess? Или есть более элегантные решения? Последний раз редактировалось Uniq!, 13.04.2013 в 22:54. |
#2
|
||||
|
||||
![]() Как-то обертку над консольным php.exe делал, результаты через пайпы затягивать приходилось. А рубивский компиль какой?
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#3
|
||||
|
||||
![]() Он не компилер, он интерпретатор.
По факту своя ком строка, которая понимает синтаксис Ruby Сейчас проблема такая: Код:
procedure TForm1.aRunExecute(Sender: TObject); begin aSave.Execute; rLog.Items.Add('[' + TimeToStr(Now) + '] Running ' + rSave.FileName); ShellExecute(0, 'open', 'cmd.exe', PWideChar('/k ruby ' + rSave.FileName), 'C:\Windows\system32\', SW_SHOW); end; если в rSave.FileName лежит строка с пробелами\русскими символами\символами типа !"№;%:?*()_ полный путь к интерпретируемому файлу обрывается Последний раз редактировалось Uniq!, 13.04.2013 в 23:56. |
#4
|
|||
|
|||
![]() если только для руби, и если https://github.com/charliesome/better_errors работает под windows, то можно попробовать создать в той папке временный файл, примерно как тот, что там в секции Usage, но в get запускающий тот файл, который должен выкинуть ошибку, запустить временный файл, и webbrowser.navigate(туда). если выскочит ошибка, то по идее должна отоброзится в webbrowser
>woweook< |
#5
|
||||
|
||||
![]() Цитата:
Код:
...PWideChar('/k ruby "' + rSave.FileName + '"'), ... Цитата:
jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 14.04.2013 в 12:15. |
#6
|
||||
|
||||
![]() Я же написал "символами типа"
![]() Проблема не решена, но... Я за ночь докопался вот до такой процедуры: Код:
procedure ExecConsoleApp(CommandLine: AnsiString; Output: TStringList; Errors: TStringList); var sa: TSECURITYATTRIBUTES; si: TSTARTUPINFO; pi: TPROCESSINFORMATION; hPipeOutputRead: THANDLE; hPipeOutputWrite: THANDLE; hPipeErrorsRead: THANDLE; hPipeErrorsWrite: THANDLE; Res, bTest: Boolean; env: array [0 .. 100] of Char; szBuffer: array [0 .. 256] of Char; dwNumberOfBytesRead: DWORD; Stream: TMemoryStream; begin sa.nLength := sizeof(sa); sa.bInheritHandle := true; sa.lpSecurityDescriptor := nil; CreatePipe(hPipeOutputRead, hPipeOutputWrite, @sa, 0); CreatePipe(hPipeErrorsRead, hPipeErrorsWrite, @sa, 0); ZeroMemory(@env, sizeof(env)); ZeroMemory(@si, sizeof(si)); ZeroMemory(@pi, sizeof(pi)); si.cb := sizeof(si); si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; si.wShowWindow := SW_HIDE; si.hStdInput := 0; si.hStdOutput := hPipeOutputWrite; si.hStdError := hPipeErrorsWrite; { Если вы хотите запустить процесс без параметров, заnil`те второй параметр и используйте первый } Res := CreateProcess(nil, pchar(CommandLine), nil, nil, true, CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, @env, nil, si, pi); // Если не получилось - то выходим if not Res then begin CloseHandle(hPipeOutputRead); CloseHandle(hPipeOutputWrite); CloseHandle(hPipeErrorsRead); CloseHandle(hPipeErrorsWrite); Exit; end; CloseHandle(hPipeOutputWrite); CloseHandle(hPipeErrorsWrite); // Читаем вывод Stream := TMemoryStream.Create; try while true do begin bTest := ReadFile(hPipeOutputRead, szBuffer, 256, dwNumberOfBytesRead, nil); if not bTest then begin break; end; Stream.Write(szBuffer, dwNumberOfBytesRead); end; Stream.Position := 0; Output.LoadFromStream(Stream); finally Stream.Free; end; // Вывод о ошибках Stream := TMemoryStream.Create; try while true do begin bTest := ReadFile(hPipeErrorsRead, szBuffer, 256, dwNumberOfBytesRead, nil); if not bTest then begin break; end; Stream.Write(szBuffer, dwNumberOfBytesRead); end; Stream.Position := 0; Errors.LoadFromStream(Stream); finally Stream.Free; end; WaitForSingleObject(pi.hProcess, INFINITE); CloseHandle(pi.hProcess); CloseHandle(hPipeOutputRead); CloseHandle(hPipeErrorsRead); end; При вызове CreateProcess ошибка: (вложения) |