Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Программа возвращает значение


Автор: Ksen 16.2.2007, 09:49
Всем здрасти))))

У меня такая проблемка....
запускаю программу с помощью функции Winexec, она отрабатывает всё хорошо....но эта программа должна возвращать мне некий ID, с которым мне дальше нужно работать....как мне можно перехватить этот ID??? Помогите, пожалуйтса!! Может можно использовать какую-нибудь другую функцию.....??

Автор: Rodman 16.2.2007, 09:51
SendMessage может?!

Автор: Yanis 16.2.2007, 09:52
Цитата(MSDN)
Note  This function is provided only for compatibility with 16-bit Windows. Applications should use the CreateProcess function.


Добавлено @ 09:53 
Цитата(Ksen @  16.2.2007,  10:49 Найти цитируемый пост)
но эта программа должна возвращать мне некий ID

А как она, тебе его возвращает?

Автор: Ksen 16.2.2007, 10:12
Rodman, чего-то у меня не получается....(((


Yanis, как возвращает??....ну например...если я в командной строке запущу это приложение....оно мне после запуска выводит ID...

Автор: Rodman 16.2.2007, 10:14
что конкретно не получается?!

Автор: Ksen 16.2.2007, 10:21
Rodman, ...немного не догоняю....а сообщение мне какое посылать?
Вот, например, я написала так....

a:=sendmessage ('trigadm.exe /Request:AddTrigger /Name:Trig01 /Queue:kolesnikovcomp\private$\isq_in', WM_ACTIVE, 0, 0);

Правильно??? поправь если не правильно....пожалуйста)))

Автор: Yanis 16.2.2007, 10:28
Ksen
http://vingrad.ru/DELPHI-DLP-000792
Представь, что в Memo выводится твой ID.

Автор: Rodman 16.2.2007, 10:29
что то ты замудрил...

одно приложение (которое формирует переменную) отсылает сообщение, а второе получает (а не запускает приложение)...

Автор: Ksen 16.2.2007, 10:56
Yanis,  smile не получается...говорит, что я передаю слишком много параметров(((
может я не правильно делаю...посмотри...
Код

procedure RunDosInMemo(CmdLine:String;AMemo:TMemo);
const  
  ReadBuffer = 2400;  
var
 Security       : TSecurityAttributes;  
 ReadPipe,WritePipe  : THandle;  
 start        : TStartUpInfo;
 ProcessInfo     : TProcessInformation;  
 Buffer        : Pchar;  
 BytesRead      : DWord;
 Apprunning      : DWord;  
begin  
 Screen.Cursor:=CrHourGlass;
 Form1.Button1.Enabled:=False;  
 With Security do begin  
 nlength        := SizeOf(TSecurityAttributes);
 binherithandle    := true;  
 lpsecuritydescriptor := nil;  
 end;
 if Createpipe (ReadPipe, WritePipe,  
        @Security, 0) then begin  
 Buffer  := AllocMem(ReadBuffer + 1);
 FillChar(Start,Sizeof(Start),#0);  
 start.cb      := SizeOf(start);  
 start.hStdOutput  := WritePipe;
 start.hStdInput  := ReadPipe;  
 start.dwFlags   := STARTF_USESTDHANDLES +  
            STARTF_USESHOWWINDOW;
 start.wShowWindow := SW_HIDE;  
 
 if CreateProcess(nil,
     PChar(CmdLine),  
     @Security,  
     @Security,
     true,  
     NORMAL_PRIORITY_CLASS,  
     nil,
     nil,  
     start,  
     ProcessInfo)
 then  
 begin  
  repeat
  Apprunning := WaitForSingleObject  
         (ProcessInfo.hProcess,100);  
   ReadFile(ReadPipe,Buffer[0],
      ReadBuffer,BytesRead,nil);  
   Buffer[BytesRead]:= #0;  
   OemToAnsi(Buffer,Buffer);
   AMemo.Text := AMemo.text + String(Buffer);  
 
  Application.ProcessMessages;
  until (Apprunning <> WAIT_TIMEOUT);  
 end;
 FreeMem(Buffer);
 CloseHandle(ProcessInfo.hProcess);
 CloseHandle(ProcessInfo.hThread);
 CloseHandle(ReadPipe);
 CloseHandle(WritePipe);
 end;
 Screen.Cursor:=CrDefault;
 Form1.Button1.Enabled:=True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Memo1.Clear;
RunDosInMemo('trigadm.exe /Request:AddTrigger /Name:Trig01 /Queue:kolesnikovcomp\private$\isq_in',Memo1);
end;


Добавлено @ 10:57 
Rodman, а можешь примерчик привести?

Автор: Yanis 16.2.2007, 11:16
Ksen
А обы приложения твои? Или запускаемая программа чужая?

Автор: Ksen 16.2.2007, 11:19
запускаемая программа чужая...(((( она создаёт тригер и связывает его с очередью сообщений.....а мне бы вытащить этот идентификатор тригера...для дальнейшей работы(((( вот мучаюсь...

Автор: Ksen 16.2.2007, 15:41
нашла статью про CreateProcess, который возвращает консольный вывод....на DelphiWord
http://delphiworld.narod.ru/base/createprocess_console.html

пытаюсь просто пингануть соседнюю машину....и посмотреть выведит ли мне в мемо результат пингования....

Вываливается ошибка Too many actual parameters......(((((( почему??!! кто-нибудь может подсказать...??  smile 

Код

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;
  a:string;
begin
  OutP := TStringList.Create;
  ErrorP := TstringList.Create;

  ExecConsoleApp('ping 192.168.0.212', OutP, ErrorP);
  Memo1.Lines.Assign(OutP);

  OutP.Free;
  ErrorP.Free;
end;

для примера...как у меня....хотя в статье всё тоже самое...((((

Автор: bartram 16.2.2007, 15:53
Ksen, этот код у меня работает, синтаксических ошибок нет! Какая версия Делфи? Я проверял на BDS 2006

Автор: Ksen 16.2.2007, 15:58
я в delphi7.....сейчас попробую тогда в 2006....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)