Запуск внешнего приложения
Модератор: Модераторы
-
Александр Яшин
- новенький
- Сообщения: 67
- Зарегистрирован: 21.11.2009 08:31:01
Запуск внешнего приложения
Как запустить внешнее приложение из своего в Linux? Ну, например, текстовый редактор KWrite.
Именно в Linux. В Windows можно функцией ShellExecute().
Именно в Linux. В Windows можно функцией ShellExecute().
ExecuteProcess?
- coyot.rush
- постоялец
- Сообщения: 309
- Зарегистрирован: 14.08.2009 08:59:48
Код: Выделить всё
Uses libc;
....
procedure run();
begin
libc.system(Pcahr('kwrite'));
end;
PS что основное приложение не "повисло" используйте потоки (TThread)
-
Александр Яшин
- новенький
- Сообщения: 67
- Зарегистрирован: 21.11.2009 08:31:01
Спасибо!
Работают оба способа. Вопрос - какой способ лучше.
Внешне второй смотрится, ну, а как на самом деле?
С потоками как-то еще не приходилось сталкиваться.
Но, вроде и без них ничего не зависает.
Пробовал запускать из своего приложения Maple
с достаточно сложными вычислениями (решение дифф. уравнения)
и ничего, не зависало!
Работают оба способа. Вопрос - какой способ лучше.
Внешне второй смотрится, ну, а как на самом деле?
С потоками как-то еще не приходилось сталкиваться.
Но, вроде и без них ничего не зависает.
Пробовал запускать из своего приложения Maple
с достаточно сложными вычислениями (решение дифф. уравнения)
и ничего, не зависало!
Запускаю внешнее приложение с помощью Tprocess http://wiki.lazarus.freepascal.org/Exec ... rograms/ru
А как допустим запустить сразу файл этого приложения, например электронную таблицу .ods OpenOffice ?
А как допустим запустить сразу файл этого приложения, например электронную таблицу .ods OpenOffice ?
- coyot.rush
- постоялец
- Сообщения: 309
- Зарегистрирован: 14.08.2009 08:59:48
Пробовал запускать из своего приложения Maple
с достаточно сложными вычислениями (решение дифф. уравнения)
и ничего, не зависало!
Под "подвисло" я понимаю временное остановку основного цикла обработки сообщений LCL (MSE) от пользователя. Для консольный приложений это норма, но гуи приложения выглядят, так как будто в них возник сбой
Работают оба способа. Вопрос - какой способ лучше.
Внешне второй смотрится, ну, а как на самом деле?
В обоих случаях вызываться отдельный шелл (оболочка)
Во втором случае должно работать на всех Unix системах
MasteRaf писал(а):Запускаю внешнее приложение с помощью Tprocess http://wiki.lazarus.freepascal.org/Exec ... rograms/ru
А как допустим запустить сразу файл этого приложения, например электронную таблицу .ods OpenOffice ?
Кроссплатформенного способа не знаю, и сомневаюсь что он есть. Под Windows можно через ShellExecute, под Linux в голову приходит только поиск OpenOffice и запуск его с передачей файла в параметре командной строки. Что-то похожее сделано в Lazarus для запуска браузера, см. lcl/lclintf.pas, function FindDefaultBrowser.
Если оформить это дело в виде отдельной функции с IFDEF'ами для каждой платформы, типа
Код: Выделить всё
function LaunchOpenOffice(const OpenDocumentFilename: string): Boolean; думаю она была бы полезна не только вам.
Odyssey писал(а): под Linux в голову приходит только поиск OpenOffice и запуск его с передачей файла в параметре командной строки.
Да я в Линуксе нуб полный
ищу, ищу этот OpenOffice-заколебался ) в терминале пишешь "ooffice -calc" и запускает. А полный путь до него кто бы подсказал, чтоб в прогу вставить.
Ещё пытаюсь в терминале открыть файл и получаю:
Код: Выделить всё
master@master-desktop ~/.wine/drive_c/lazarus $ ./test.ods
invalid file (bad magic number): Exec format errorMasteRaf писал(а):Да я в Линуксе нуб полный![]()
ищу, ищу этот OpenOffice-заколебался ) в терминале пишешь "ooffice -calc" и запускает. А полный путь до него кто бы подсказал, чтоб в прогу вставить.
так и попробуй команду:
Код: Выделить всё
which ooffice
Нашел вроде.
Только прога, при такой попытке
выдает "Failed to execute usr/bin/ooffice : 2"
Только прога, при такой попытке
Код: Выделить всё
AProcess.CommandLine := 'usr/bin/ooffice';выдает "Failed to execute usr/bin/ooffice : 2"
MasteRaf писал(а):Нашел вроде.
Только прога, при такой попыткеКод: Выделить всё
AProcess.CommandLine := 'usr/bin/ooffice';
выдает "Failed to execute usr/bin/ooffice : 2"
попробуй так:
Код: Выделить всё
AProcess.CommandLine := '/usr/bin/ooffice';поверь, слеш в начале пути не случаен
скалогрыз писал(а):поверь, слеш в начале пути не случаен
аааааааа !!! шайтан-ака!!! круто-круто
Делаю так теперь:
Код: Выделить всё
AProcess.CommandLine := '/usr/bin/ooffice -calc "/home/master/.wine/drive_c/lazarus/test.ods"'и всё пучком) спасибо
MasteRaf писал(а):Как теперь передать имя файла, который надо открыть?
Капитан Очевидность твердит, что-то вроде
Код: Выделить всё
AProcess.CommandLine := '/usr/bin/ooffice -calc "'+FileName+'"';где FileName это имя файла, который нужно открыть.
но сий вопрос должен быть задан на форуме Open Office ^^
Теперь встал такой вопрос - как правильно оформить синтаксис выбора этого файла через OpenDialog ?
Проблема в том, что OpenDialog передает в переменную FileName строку C:/ARM/test.ods
А терминал работает нормально с таким путем /home/master/.wine/drive_c/ARM/test.ods
Как быть?
Я грешу на то, что ставил lazarus-0.9.28.2-fpc-2.2.4-win32.exe в Linux Mint 8.1 "Росинка" x86, и работаю сейчас так.
Скачивал lazarus-0.9.28.2-0.i586.rpm, но не смог поставить, разобраться. Может в lazarus под Linux OpenDialog передает как раз путь вида /home/master/.wine/drive_c/ARM/test.ods ?
Код: Выделить всё
...
with OpenDialog1 do
if Execute then
begin
....
AProcess.CommandLine := '/usr/bin/ooffice -calc "'+FileName+'"';Проблема в том, что OpenDialog передает в переменную FileName строку C:/ARM/test.ods
А терминал работает нормально с таким путем /home/master/.wine/drive_c/ARM/test.ods
Как быть?
Я грешу на то, что ставил lazarus-0.9.28.2-fpc-2.2.4-win32.exe в Linux Mint 8.1 "Росинка" x86, и работаю сейчас так.
Скачивал lazarus-0.9.28.2-0.i586.rpm, но не смог поставить, разобраться. Может в lazarus под Linux OpenDialog передает как раз путь вида /home/master/.wine/drive_c/ARM/test.ods ?
Последний раз редактировалось MasteRaf 06.06.2010 12:05:10, всего редактировалось 1 раз.
