![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
|
|
#1
|
||||
|
||||
|
Ребят, только не бросайтесь фразами: "А уже дофига всяких IDE, зачем тратить время, силы бла бла бла всё равно лучше не сделаешь"
Я для себя. Просто хочу разобраться как эти программы работают. Значит проблема следующая: как отдать файл компилятору (интерпретатору), и вернуть результат в виде ошибок, если они есть. Я так понимаю командная строка + CreateProcess? Или есть более элегантные решения? Последний раз редактировалось Uniq!, 13.04.2013 в 22:54. |
|
#2
|
||||
|
||||
|
Как-то обертку над консольным php.exe делал, результаты через пайпы затягивать приходилось. А рубивский компиль какой?
|
|
#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
|
|
#5
|
||||
|
||||
|
Цитата:
Код:
...PWideChar('/k ruby "' + rSave.FileName + '"'), ...Цитата:
Последний раз редактировалось 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 ошибка: (вложения) |