ExecuteProcess - не работает. Чем заменить?

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

ExecuteProcess - не работает. Чем заменить?

Сообщение tria » 24.10.2006 12:53:48

Всем добрый день.

Задача: из приложения открыть html-файл во внешнем броузере на нужной закладке.

Под виндой решилось просто:
ExecuteProcess('explorer',BrowsePath);

Под Линуксом (CentOS) это дело отказывается работать:
ExecuteProcess('htmlview',BrowsePath);
При чем не работает и так:
ExecuteProcess('lazarus','');
Выдает ошибку OSError Failed to execute htmlview: 127

Подскажите плиз, как можно решить данную проблему?
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение Sergei I. Gorelkin » 24.10.2006 16:27:52

А как насчет TProcess из FCL? Вроде бы довольно отлаженная штука...
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1395
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение tria » 24.10.2006 17:19:23

Sergei I. Gorelkin писал(а):А как насчет TProcess из FCL? Вроде бы довольно отлаженная штука...


Спасибо.
Посмотрю, попробую, отчитаюсь :)
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Сообщение tria » 25.10.2006 13:43:18

Отчитываюсь:)
Работает и в винде, и в линуксе.
Спасибо.
tria
постоялец
 
Сообщения: 401
Зарегистрирован: 03.04.2006 11:24:10

Re: ExecuteProcess - не работает. Чем заменить?

Сообщение Сквозняк » 07.06.2023 02:09:00

В линуксе есть хорошая функция fpsystem, а в винде нужно использовать TProcess, а его в 3 версии компилятора сломали. Командная строка записывается в ansistring, а он перекодируется с потерей информации.

Казалось бы, есть sysutils.ExecuteProcess но он при ошибке выполнения команды вырубает программу, которая его запустила. Вокруг какое-то вредительство

Добавлено спустя 1 час 53 минуты 59 секунд:
Моя прелесть :mrgreen: Другого нормального решения (из лазаруса ничего тащить не хотелось) кроме как форкнуть для винды функцию sysutils.ExecuteProcess не нашёл. Но она красиво форкнулась и теперь даже не требует рубить командную строку на кучу частей.
Код: Выделить всё
uses
windows, sysutils;

VAR
Z5,X5: unicodestring;



function ExecuteProcess2(Const CommandLine: UnicodeString):longint;
// win specific  function
var
  SI: TStartupInfoW;
  PI: TProcessInformation;
  Proc : THandle;
  l    : DWord;
  CommandLine5 : unicodestring;
// e : EOSError;
  ExecInherits : longbool;
  Flags:TExecuteFlags;
begin
  ExecuteProcess2:=0;
  Flags:=[];//Пока нету таких данных, пусть будет заглушка.
  FillChar(SI, SizeOf(SI), 0);
  SI.cb:=SizeOf(SI);
  SI.wShowWindow:=1;
  { always surround the name of the application by quotes
    so that long filenames will always be accepted. But don't
    do it if there are already double quotes, since Win32 does not
    like double quotes which are duplicated!
  }
  CommandLine5 := CommandLine + #0;

  ExecInherits:=ExecInheritsHandles in Flags;

  if not CreateProcessW(nil, pwidechar(CommandLine5),
    Nil, Nil, ExecInherits,$20, Nil, Nil, SI, PI) then
    begin
    //  e:=EOSError.CreateFmt(SExecuteProcessFailed,[CommandLine,GetLastError]);
   //   e.ErrorCode:=GetLastError;
   //   raise e;
    ExecuteProcess2:=-1;
    end;
  Proc:=PI.hProcess;
  if WaitForSingleObject(Proc, dword($ffffffff)) <> $ffffffff then
    begin
      GetExitCodeProcess(Proc,l);
      CloseHandle(Proc);
      CloseHandle(PI.hThread);
      ExecuteProcess2:=l;
    end
  else
    begin
  //    e:=EOSError.CreateFmt(SExecuteProcessFailed,[CommandLine,GetLastError]);
  //    e.ErrorCode:=GetLastError;
      CloseHandle(Proc);
      CloseHandle(PI.hThread);
   //   raise e;
      ExecuteProcess2:=-1;
    end;
end;



begin
GETDIR(0,X5);
Z5:='"'+X5+'\2.exe"';
writeln('ExecuteProcess2=',ExecuteProcess2(Z5),' Z5=',Z5);
end.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: ExecuteProcess - не работает. Чем заменить?

Сообщение Alex2013 » 08.06.2023 22:33:54

А чем канонический вариант плох?
https://wiki.lazarus.freepascal.org/Webbrowser
В винде OpenURL "Решает" в линуксе не пробовал но по идее может сработать.
Зы
https://www.cyberforum.ru/lazarus/thread1341055.html
Alex2013
долгожитель
 
Сообщения: 2924
Зарегистрирован: 03.04.2013 11:59:44


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Alex2013, Google [Bot] и гости: 34

Рейтинг@Mail.ru