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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2010, 00:11   #1
Vov
Новичок
Джуниор
 
Регистрация: 29.07.2010
Сообщений: 2
По умолчанию Запуск и чтение ответа от php.exe

Сама идея в том, чтобы без сервера использовать в работе php скрипты.
Использую такую функцию:

Код:
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..MAX_PATH] of Char;
  szBuffer: array[0..MAX_PATH] 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.FormCreate(Sender: TObject);

begin


  OutP := TStringList.Create;
  ErrorP := TstringList.Create;

  ExecConsoleApp('c:/f/php.exe c:/f/xz.php', OutP, ErrorP);

  RichEdit1.Lines.Add(OutP.Text);

  OutP.Free;
  ErrorP.Free;

end;
всё работает, КРОМЕ любых контактов с интернетом, например скрипт:

PHP код:
<?php 
print_r
(file("http://mail.ru/"));
 
?>
выдает ошибку :
Цитата:
Warning: file(): php_network_getaddresses: getaddrinfo failed: Этот хост неизвестен. in C:\f\xz.php on line 2

Warning: file(http://mail.ru/): failed to open stream: php_network_getaddresses: getaddrinfo failed: Этот хост неизвестен. in C:\f\xz.php on line 2
При выполнении той же "операции" с помощью командной строки, или просто передачи тому же php.exe в параметрах пути к этому скрипту или вызова его через
ShellExecute (Form1.Handle, nil, 'c:/f/php.exe', 'c:/f/xz.php', nil, SW_RESTORE);

всё работает, но мне нужно получить и обработать результат работы скрипта, а эти способы не дают такой возможности

Что делать? и почему так происходит? второй день бьюсь головой в стену...
Vov вне форума Ответить с цитированием
Старый 30.07.2010, 07:01   #2
grafgrial
Просто хороший
Форумчанин
 
Аватар для grafgrial
 
Регистрация: 26.03.2010
Сообщений: 562
По умолчанию

приложите исходник, посмотрю
Помог, нажми весы слева
grafgrial вне форума Ответить с цитированием
Старый 30.07.2010, 07:10   #3
Vov
Новичок
Джуниор
 
Регистрация: 29.07.2010
Сообщений: 2
По умолчанию

Спасибо всем)), проблему уже решил.
grafgrial - в исходнике для вас нет ничего интересного, суть в этой функции.
Vov вне форума Ответить с цитированием
Старый 30.07.2010, 07:13   #4
grafgrial
Просто хороший
Форумчанин
 
Аватар для grafgrial
 
Регистрация: 26.03.2010
Сообщений: 562
По умолчанию

Ок, удачи тебе
Помог, нажми весы слева
grafgrial вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запуск *.exe из программы Djaconda Паскаль, Turbo Pascal, PascalABC.NET 22 01.03.2012 00:27
Запуск exe Betty Общие вопросы Delphi 6 10.07.2009 21:25
чтение из одного exe файла, и запись в другой exe inndim Общие вопросы Delphi 2 04.02.2009 15:23
запуск exe Manitu Помощь студентам 11 02.05.2008 19:03
Запуск exe с параметрами Altera Общие вопросы Delphi 2 26.02.2008 21:25