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

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

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2009, 07:47   #1
Consol
Пользователь
 
Регистрация: 19.08.2009
Сообщений: 89
По умолчанию передача параметров в createprocess

у меня программа запускает консольное приложение cons.exe , но это консольное приложение использует данные из файла tex.txt как мне в createprocess передать в параметрах tex.txt . пишу на Делфи
вот код
Код:
procedure RunDosInMemo(DosApp:String;AMemo:TMemo) ;
var
l:boolean;
dwAvail:Cardinal;
Security : TSecurityAttributes;
ReadPipe,WritePipe : THandle;
start : TStartUpInfo;
ProcessInfo : TProcessInformation;
BytesRead : DWord;
Apprunning : DWord;
x : Integer;
MyStr,s : String;
ss:string;
begin
FullPathNameParamFile]);
  x := 0;
  With Security do
  begin
   Security.nlength := SizeOf(TSecurityAttributes) ;
   Security.binherithandle := true;
   Security.lpsecuritydescriptor := nil;
  end;

  if Createpipe (ReadPipe, WritePipe,
                 @Security, 0) then
  begin
    ZeroMemory(@start, SizeOf(TStartupInfo)); ;
    start.cb := SizeOf(STARTUPINFO) ;
    start.hStdOutput := WritePipe;
    start.hStdInput := ReadPipe;
    start.dwFlags := STARTF_USESTDHANDLES ;
    start.wShowWindow := SW_SHOW;

 if CreateProcess(nil,
          PChar(DosApp),
          @Security,
          @Security,
          true,
          NORMAL_PRIORITY_CLASS,
          nil,
          nil,
          start,
          ProcessInfo)
    then
    begin
    CloseHandle(WritePipe) ;
    repeat

       WaitForSingleObject(ProcessInfo.hProcess, 1000);

        PeekNamedPipe(ReadPipe, nil, 0, nil, @dwAvail, nil);
        if dwAvail>0 then
         begin
          SetLength(S, dwAvail);

         ReadFile(ReadPipe,PChar(S)^, Length(S), BytesRead,nil);
          ShowMessage(s);

         end;
    until(dwAvail>0);


      CloseHandle(ProcessInfo.hProcess) ;
      CloseHandle(ProcessInfo.hThread) ;
      CloseHandle(ReadPipe) ;

   {   TerminateProcess(pi.hProcess,NO_ERROR);}
    end;

  end;

 end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  RunDosInMemo('"c:\cons.exe" "C:\tex.txt"',memo1) ;{see AnsiQuotedStr}
end;
Consol вне форума Ответить с цитированием
Старый 27.08.2009, 08:44   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Что ж ты настойчивый такой. Это ведь кросспосты:
Вот чтоб покончить раз и навсегда с твоими нарушениями пример:
Твоя прога:
Код:
unit Unit1;

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

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
 ExecConsoleApp('project2.exe c:\text\',Memo1.Lines);
end;

end.
Консольная:
Код:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;

begin
 Writeln('Ýòî áûë ',paramstr(1));
  { TODO -oUser -cConsole Main : Insert code here }
end.
Здесь найдешь тело ExecConsoleApp
http://www.programmersforum.ru/showthread.php?
t=22381&highlight=ExecConsoleApp

НЕужели так трудно поиском порулить, а?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.08.2009, 12:12   #3
Consol
Пользователь
 
Регистрация: 19.08.2009
Сообщений: 89
По умолчанию

большое спасибо
Consol вне форума Ответить с цитированием
Старый 27.08.2009, 12:16   #4
Consol
Пользователь
 
Регистрация: 19.08.2009
Сообщений: 89
По умолчанию

опять проблема, у меня запускаемая дочерняя консольная программа выводит информацию а затем ждет что бы ввели некоторые данные, так вот из за того что надо ввести некоторые данные моя программ останавливается на строке
Код:
PeekNamedPipe(ReadPipe, nil, 0, nil, @dwAvail, nil);
, но как мне получить то что программа уже вывела, а затем ввести данные??? а то что то поискал, так и не нашел ничего
Consol вне форума Ответить с цитированием
Старый 27.08.2009, 12:24   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

В данном случае нужно смотреть что просит программа, как она работает.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.08.2009, 12:29   #6
Consol
Пользователь
 
Регистрация: 19.08.2009
Сообщений: 89
По умолчанию

Цитата:
В данном случае нужно смотреть что просит программа, как она работает.
1 какая программа консольная или моя
2 если консольная просит просто ввести число
Код:
  int i;
   cin  >> i;
   cout << i;

Последний раз редактировалось Consol; 27.08.2009 в 12:33.
Consol вне форума Ответить с цитированием
Старый 27.08.2009, 12:44   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если мне не изменяет память то:
Код:
 ExecConsoleApp('in.txt > project2.exe c:\text\',Memo1.Lines);
Здесь in.txt - это файл в котором буде тобой заранее забит ввод для консоли
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.08.2009, 12:47   #8
Consol
Пользователь
 
Регистрация: 19.08.2009
Сообщений: 89
По умолчанию

нет мне хотелось бы не так сделать, то есть надо что бы было вот как
я запускаю программу она запускает консольную считывает строку
"Введите число", я на форме в поле ввожу число (например 2) это передается консольной, консольная обрабатывает полученные данные и выдает результат "Вы ввели число 2", такое реально сделать????
Consol вне форума Ответить с цитированием
Старый 27.08.2009, 12:52   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да но я это не прорабатывал. Точно так же как ты назначил выходной пайп так и входной нужно делать кажись
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.08.2009, 12:58   #10
Consol
Пользователь
 
Регистрация: 19.08.2009
Сообщений: 89
По умолчанию

да это понятно, мне просто не понятно как можно считать то что написала консольная программа, потому что когда я запускаю просто ничего не считывается так как ожидается ввод данных, но пользователю то надо увидеть что он должен ввести, хотя после запуска консольной программы она выводит текст "Введите число" и ждет пока не введут число, но моя программа почему то не считывает и не выдает мне этот текст
Consol вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача и параметров между страницами Killer_djon JavaScript, Ajax 3 04.02.2009 04:07
Передача параметров aesoem Общие вопросы Delphi 8 15.07.2008 21:51
CDialog передача параметров! mahsus Общие вопросы .NET 4 09.03.2008 17:40
Передача параметров Gudzon Общие вопросы Delphi 12 08.02.2007 08:19