Аналог функции FindExecutable в Linux

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

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

Аналог функции FindExecutable в Linux

Сообщение mktcrt » 27.02.2010 23:10:50

Здравствуйте!
У меня два вопроса.
1. Нужно программно определить полный путь по заданному имени файла. В Windows имеется функция FindExecutable().
Есть ли подобная функция для Linux?
2. В TreeView выведено содержимое каталога. Необходимо по двойному щелчку по имени исполняемого файла запустить его. Как это сделать в Linux?

В Windows я сделал, вот код (привожу только оператор uses, поскольку это важно и саму процедуру обработки события OnDblClick:
Код: Выделить всё
uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ComCtrls, StdCtrls, ExtCtrls, LCLType,

  {$IFDEF UNIX}
    unix;
  {$ELSE}
    ShellApi, Windows;
  {$ENDIF}
....................................................
....................................................
procedure TForm1.ListView1DblClick(Sender: TObject);
var
  s: string;
  progr: pchar;
  name_progr: array[0..255] of char;
begin
  if ListView1.Selected <> nil then
  begin
  s:= ListView1.Selected.Caption;
  s:= UTF8ToSys(s);
  progr:= pchar(s);
  FindExecutable(progr, nil, name_progr);
  {$IFDEF UNIX}
    shell(progr); // это не проходит
  {$ELSE}
    ShellApi.ShellExecute(Handle, nil, name_progr, nil, nil, 1);
  {$ENDIF}
  end;
end;
mktcrt
незнакомец
 
Сообщения: 8
Зарегистрирован: 27.02.2010 22:55:09

Re: Аналог функции FindExecutable в Linux

Сообщение perlpunk » 28.02.2010 12:53:46

в линукс есть shell команда which, возможно аналогичная функция имеется в системной библиотекe, либо вызывать ее через shell/fpsystem и читать результат.
Так же можно написать свою - всего лишь сделав поиск в переменных окружения.
perlpunk
новенький
 
Сообщения: 90
Зарегистрирован: 26.09.2008 21:19:48

Re: Аналог функции FindExecutable в Linux

Сообщение mktcrt » 28.02.2010 13:38:57

Спасибо.
Надобность в функции FindExecutable() отпала, т.к. ввел переменную path, в которой отслеживаю путь к файлу.
Кроме того, убрал функцию UTF8ToSys() и все заработало.
Код: Выделить всё
procedure TForm1.ListView1DblClick(Sender: TObject);
var
  s: string;
  progr: pchar;
begin
  if ListView1.Selected <> nil then
  begin
  s:= path + ListView1.Selected.Caption;
  progr:= pchar(s);
  {$IFDEF UNIX}
    shell(progr);
  {$ELSE}
    ShellApi.ShellExecute(Handle, nil, progr, nil, nil, 1);
  {$ENDIF}
  end;
end;   


Но появилась другая проблема. В Linux, при двойном клике на исполняемый файл, программа запускается дважды!
Как это устранить?
mktcrt
незнакомец
 
Сообщения: 8
Зарегистрирован: 27.02.2010 22:55:09

Re: Аналог функции FindExecutable в Linux

Сообщение Vadim » 28.02.2010 17:49:36

mktcrt писал(а):В Linux, при двойном клике на исполняемый файл, программа запускается дважды!
Как это устранить?

Это не Linux, это оболочка виновата. У Вас, наверное, KDE?
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Аналог функции FindExecutable в Linux

Сообщение mktcrt » 02.03.2010 09:09:17

Нашел решение через TProcess:

Код: Выделить всё
procedure TForm1.ListView1DblClick(Sender: TObject);
var
   s: string;
   progr: pchar;
   AProcess: TProcess;
begin
   if ListView1.Selected <> nil then
   begin
      s:= path + ListView1.Selected.Caption;
      progr:= pchar(s);
      AProcess := TProcess.Create(nil);
      AProcess.CommandLine := progr;     
      AProcess.Execute;
      AProcess.Free;
   end;
end;   


Теперь в Linux при двойном клике на исполняемый файл она запускается один раз. {$IFDEF} вообще не нужен.

К сожалению возникает еще одна проблема.
В Linux запускается только программа с GUI. Исполняемый файл консольного приложения не запускается (и в прежнем варианте тоже).
В Windows все запускается замечательно.
Как все-таки запустить в Linux консольное приложение?
mktcrt
незнакомец
 
Сообщения: 8
Зарегистрирован: 27.02.2010 22:55:09

Re: Аналог функции FindExecutable в Linux

Сообщение perlpunk » 02.03.2010 15:03:16

mktcrt писал(а):Исполняемый файл консольного приложения не запускается (и в прежнем варианте тоже).
Как все-таки запустить в Linux консольное приложение?


На основании чего вы решили что не запускается?
Потому-что не выводит консольное окошко? Так и недолжно его выводить.
perlpunk
новенький
 
Сообщения: 90
Зарегистрирован: 26.09.2008 21:19:48

Re: Аналог функции FindExecutable в Linux

Сообщение mktcrt » 02.03.2010 15:08:03

Не понял.
Имеется консольная программа, выводящая какие-то результаты. Да "в консольном окошке".
Получается такие программы нельзя запускать из другой программы, что ли?
mktcrt
незнакомец
 
Сообщения: 8
Зарегистрирован: 27.02.2010 22:55:09

Re: Аналог функции FindExecutable в Linux

Сообщение Alexx2000 » 02.03.2010 15:42:08

mktcrt писал(а):Имеется консольная программа, выводящая какие-то результаты. Да "в консольном окошке".
Получается такие программы нельзя запускать из другой программы, что ли?

Чтобы консольная программа запускалась в окошке, надо её запускать через эмулятор терминала, например через xterm:
Код: Выделить всё
xterm -e sh -c program_name
Аватара пользователя
Alexx2000
постоялец
 
Сообщения: 488
Зарегистрирован: 25.10.2006 00:22:07
Откуда: Мытищи

Re: Аналог функции FindExecutable в Linux

Сообщение perlpunk » 02.03.2010 18:44:23

mktcrt писал(а):Не понял.
Имеется консольная программа, выводящая какие-то результаты. Да "в консольном окошке".
Получается такие программы нельзя запускать из другой программы, что ли?


запустить можно. другое дело, что если вам нужно так называемое "консольное окошко", то нужно запускать эмулятор терминала и в ней уже ту "консольную" программу. как в приведенном выше примере.
perlpunk
новенький
 
Сообщения: 90
Зарегистрирован: 26.09.2008 21:19:48

Re: Аналог функции FindExecutable в Linux

Сообщение alexs » 02.03.2010 21:00:58

Если просто вывод программы хотите увидеть - прочитайте из выходного потока - и не нужен терминал.
Аватара пользователя
alexs
долгожитель
 
Сообщения: 4060
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь

Re: Аналог функции FindExecutable в Linux

Сообщение mktcrt » 02.03.2010 21:52:49

Пишу (для души) нечто вроде похожее на Проводник. Хотелось, чтобы программы запускались как в Проводнике.
В последнее время увлекся Linux и написанием кроссплатформенных приложений.
Теперь по существу.
При запуске через эмулятор терминала:
Код: Выделить всё
xterm -e sh -c program_name

терминал открывается и тут же закрывается.
Попробовал применить параметры, указанные в Lazarus (Запуск->Параметры запуска->Использовать приложение для запуска).
После многочисленных экспериментов выяснилось, что консольное приложение запускается следующим образом:
Код: Выделить всё
'xterm -T ''Lazarus Run Output'' -e $(TargetCmdLine)'

При запуске правда выходит сообщение в терминале:
Код: Выделить всё
bash: TargetCmdLine: command not found

Но, если убрать параметр $(TargetCmdLine), программа перестает запускаться. Ну это, в принципе, терпимо.
Возникает другой неприятный момент. Если запустить графическую программу, то она запускается, но, к сожалению, одновременно запускается и терминал с сообщением:
Код: Выделить всё
[Warning] Out of OEM specific VK codes, changing to unassigned

Причем, если закрыть терминал, то автоматически закрывается и запущенная программа.
Существует ли какой-нибудь параметр, не открывающий терминал, если это программа с GUI?
Или можно ли программно определить какой это исполняемый файл, т.е. консольное или графическое?
По логике вещей хотелось бы сделать следующее (фрагмент кода):
Код: Выделить всё
AProcess := TProcess.Create(nil);
{$IFDEF UNIX}
if <это консольное приложение> then
     s:= 'xterm -T ''Lazarus Run Output'' -e $(TargetCmdLine)' + s;
{$ENDIF}
   progr:= pchar(s);
   AProcess.CommandLine := progr;
   AProcess.Execute;
   AProcess.Free;
mktcrt
незнакомец
 
Сообщения: 8
Зарегистрирован: 27.02.2010 22:55:09

Re: Аналог функции FindExecutable в Linux

Сообщение coyot.rush » 02.03.2010 22:02:35

"Курим" man execve http://www.opennet.ru/man.shtml?topic=execve&category=2&russian=0
Не забваем про fork :D
Аватара пользователя
coyot.rush
постоялец
 
Сообщения: 309
Зарегистрирован: 14.08.2009 08:59:48

Re: Аналог функции FindExecutable в Linux

Сообщение Brainenjii » 02.03.2010 22:50:04

Может я чего не понял, но как насчёт TProcess?
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Аналог функции FindExecutable в Linux

Сообщение mktcrt » 03.03.2010 06:37:33

Добавлено спустя 11 минут 32 секунды:
Brainenjii писал(а):Может я чего не понял, но как насчёт TProcess?


Смотри код выше. Разве это не TProcess?

Добавлено спустя 1 минуту 43 секунды:
coyot.rush писал(а):"Курим" man execve http://www.opennet.ru/man.shtml?topic=execve&category=2&russian=0
Не забваем про fork :D

Это же С++. И как подключить unistd.h?
mktcrt
незнакомец
 
Сообщения: 8
Зарегистрирован: 27.02.2010 22:55:09

Re: Аналог функции FindExecutable в Linux

Сообщение perlpunk » 03.03.2010 15:45:51

mktcrt писал(а):Существует ли какой-нибудь параметр, не открывающий терминал, если это программа с GUI?
Или можно ли программно определить какой это исполняемый файл, т.е. консольное или графическое?

Вы неправильно понимаете некоторые базовые вещи. В linux нет такого понятия "консольное приложение".
Любая программа, с GUI или без, может что-то писать в стандартный вывод (STDIN) и читать из ввода (STDOUT).
А эмулятор терминала (это тоже графическое приложение хотя и выводит текст) работает с этими потоками ввода-вывода, выводит на экран то что выдала программа.

Можно просто выдавать диалог - запускать в терминале или просто запустить. К примеру в Ubuntu в файловом менеджере Nautilus при попытке запустить исполняемый файл выдается подобный диалог выбора
perlpunk
новенький
 
Сообщения: 90
Зарегистрирован: 26.09.2008 21:19:48

След.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 47

Рейтинг@Mail.ru