Всем добрый день.
Задача: из приложения открыть html-файл во внешнем броузере на нужной закладке.
Под виндой решилось просто:
ExecuteProcess('explorer',BrowsePath);
Под Линуксом (CentOS) это дело отказывается работать:
ExecuteProcess('htmlview',BrowsePath);
При чем не работает и так:
ExecuteProcess('lazarus','');
Выдает ошибку OSError Failed to execute htmlview: 127
Подскажите плиз, как можно решить данную проблему?
ExecuteProcess - не работает. Чем заменить?
Модератор: Модераторы
- Sergei I. Gorelkin
- энтузиаст
- Сообщения: 1409
- Зарегистрирован: 24.07.2005 14:40:41
- Откуда: Зеленоград
В линуксе есть хорошая функция fpsystem, а в винде нужно использовать TProcess, а его в 3 версии компилятора сломали. Командная строка записывается в ansistring, а он перекодируется с потерей информации.
Казалось бы, есть sysutils.ExecuteProcess но он при ошибке выполнения команды вырубает программу, которая его запустила. Вокруг какое-то вредительство
Добавлено спустя 1 час 53 минуты 59 секунд:
Моя прелесть
Другого нормального решения (из лазаруса ничего тащить не хотелось) кроме как форкнуть для винды функцию sysutils.ExecuteProcess не нашёл. Но она красиво форкнулась и теперь даже не требует рубить командную строку на кучу частей.
Казалось бы, есть sysutils.ExecuteProcess но он при ошибке выполнения команды вырубает программу, которая его запустила. Вокруг какое-то вредительство
Добавлено спустя 1 час 53 минуты 59 секунд:
Моя прелесть
Код: Выделить всё
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.
А чем канонический вариант плох?
https://wiki.lazarus.freepascal.org/Webbrowser
В винде OpenURL "Решает" в линуксе не пробовал но по идее может сработать.
Зы
https://www.cyberforum.ru/lazarus/thread1341055.html
https://wiki.lazarus.freepascal.org/Webbrowser
В винде OpenURL "Решает" в линуксе не пробовал но по идее может сработать.
Зы
https://www.cyberforum.ru/lazarus/thread1341055.html
