Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.04.2011, 15:15   #1
Simply-Art
Программист и
Участник клуба
 
Аватар для Simply-Art
 
Регистрация: 29.10.2006
Сообщений: 1,265
По умолчанию Запустить компилятор в консоле и считать что он выводит

Вот собственно и проблема, искал в инете, нигде нет нормально работающего кода. Прошу не копируйте тупо другой код, проверьте, работает ли он у вас! А то знаю, загуглил, первую похожую ссылку кинул и нифига не пашет. Гуглить я и сам умею.

P.S. Надеюсь на нормальные ответы.
Simply-Art вне форума Ответить с цитированием
Старый 25.04.2011, 15:47   #2
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

А где пример неработающего кода?
eduard93 вне форума Ответить с цитированием
Старый 25.04.2011, 16:28   #3
Simply-Art
Программист и
Участник клуба
 
Аватар для Simply-Art
 
Регистрация: 29.10.2006
Сообщений: 1,265
По умолчанию

http://delphiworld.narod.ru/base/console_in_out.html
http://forum.sources.ru/index.php?showtopic=89005
Может я что-то не так делаю, но не один из премеров не пашет. На делфиворлд вообще код приходилось править чтобы скомпилить.
Simply-Art вне форума Ответить с цитированием
Старый 25.04.2011, 18:02   #4
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

Код в делфиворде зависит от версии делфи. В 2009 и выше он скорее всего работать не будет. Плюс там еще знаки равно кудато делись.
По второй ссылке вообще асм, если вы в нем не разбираетесь, то лучше держатся подальше.
Неплохие примеры я видел в DRKB, но опять же их работоспособность зависит от версии делфей.
eduard93 вне форума Ответить с цитированием
Старый 25.04.2011, 18:57   #5
Simply-Art
Программист и
Участник клуба
 
Аватар для Simply-Art
 
Регистрация: 29.10.2006
Сообщений: 1,265
По умолчанию

У меня 7 делфи. А нет тогда какого то модуля или компонента, не зависящего от версии?
Simply-Art вне форума Ответить с цитированием
Старый 25.04.2011, 19:47   #6
eduard93
Форумчанин
 
Регистрация: 06.12.2010
Сообщений: 300
По умолчанию

На седьмой делфе должен железно работать код из DRKB. И из делфиворда вроде тоже.
eduard93 вне форума Ответить с цитированием
Старый 25.04.2011, 20:01   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,430
По умолчанию

Цитата:
У меня 7 делфи. А нет тогда какого то модуля или компонента, не зависящего от версии?
Разве что руками писать. Люд не будет править свои модули "на халяву" другим чтобы код пахал где угодно(разве что для себя любимых).

p.S.

Цитата:
А то знаю, загуглил, первую похожую ссылку кинул и нифига не пашет.
Если думать головой а не копипастом, то будет работать что угодно и где угодно


По теме:

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

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;   
    
  (* Remember that if you want to execute an app with no parameters you nil the  
     second parameter and use the first, you can also leave it as is with no  
     problems.                                                                 *)  
  Res := CreateProcess(nil, pchar(CommandLine), nil, nil, true,   
    CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, @env, nil, si, pi);   
    
  // Procedure will exit if CreateProcess fail   
  if not Res then  
  begin  
    CloseHandle(hPipeOutputRead);
    CloseHandle(hPipeOutputWrite);   
    CloseHandle(hPipeErrorsRead);   
    CloseHandle(hPipeErrorsWrite);   
    Exit;   
  end;   
  CloseHandle(hPipeOutputWrite);   
  CloseHandle(hPipeErrorsWrite);   
    
  //Read output pipe   
  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;   
    
  //Read error pipe
  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;


procedure TForm1.Button1Click(Sender: TObject);
var
  OutP: TStringList;
  ErrorP: TStringList;
begin
  OutP := TStringList.Create;
  ErrorP := TstringList.Create;

  ExecConsoleApp('cmd.exe', OutP, ErrorP);
  Memo1.Lines.Assign(OutP);

  OutP.Free;
  ErrorP.Free;
end;

end.
d7,d2010 работает.

Последний раз редактировалось Человек_Борща; 25.04.2011 в 20:05.
Человек_Борща вне форума Ответить с цитированием
Старый 26.04.2011, 12:35   #8
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Цитата:
какого то модуля или компонента
В JEDI есть TJvCreateProcess.onRead/onRawRead

http://programmersforum.ru/showthrea...916#post332916
пыщь

Последний раз редактировалось JTG; 26.04.2011 в 12:58.
JTG вне форума Ответить с цитированием
Старый 29.04.2011, 04:32   #9
Simply-Art
Программист и
Участник клуба
 
Аватар для Simply-Art
 
Регистрация: 29.10.2006
Сообщений: 1,265
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
...
d7,d2010 работает.
Спасибо, код то-что надо было, всё работает отлично!
Simply-Art вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
компилятор ошибок не выдаёт, но прога не делает то что нужно... Chica Bond Общие вопросы C/C++ 5 02.05.2010 22:53
Что выводит функция var_dump? akokin PHP 8 23.01.2010 10:33
Что такое мемтест и как его запустить? Ромио Операционные системы общие вопросы 3 14.08.2009 08:54
как сделать что б в програме рандом выводил отрицательные елементы?он выводит токо 0,2...0,8 короче до 1 innaa639 Помощь студентам 5 28.05.2009 12:26
что такое компилятор, компановщик, отладчик +Hitman+ Помощь студентам 4 03.03.2008 16:42