задача:
Я хотел бы создать свое собственное расширение файла, чтобы при нажатии на определенный «точечный» файл моя программа открывала его. Тем не менее, эта программа, которую я написал, является просто посредником в том, что она будет выполнять некоторую обработку, но в конечном итоге передать этот файл другой программе для обработки.
пример:
Так, например, все простые текстовые файлы с расширением .foo
будет выглядеть так, как будто они открываются gedit
, Но на самом деле происходит то, что они открываются с помощью одной из моих программ, и, в свою очередь, моя программа передает этот файл на gedit
,
моя с ++ программа для этого выглядит так:
#include <string>
#include <cstdlib>
int main(int argc, char** argv) {
//open file with gedit
system(("(gedit " + std::string(argv[1]) + " > /dev/null &)").c_str());
//do other processing
//...
}
Я полагаю, что когда вы нажимаете на файл, и операционная система говорит, что он должен быть открыт с определенной программой, это имя файла передается программе на С ++ в качестве второго аргумента этой программы (как индекс 1, так как нулевой индекс — это программа название).
&
это так, что gedit
запускается как фоновый процесс, а дополнительный ()
вокруг утверждения гарантирует, что gedit
не будет закрыт, когда родительская оболочка закрыта.
проблема:
С учетом всего вышесказанного, эта программа работает правильно, когда мой двоичный файл находится в папке, которая указана в моей переменной $ PATH, и я запускаю программу из командной строки, передавая файл, как если бы он был нажат. Тем не менее, это не работает, когда я на самом деле установить файл, который будет открыт с программой.
как я настроил запуск программы по клику файла:
Я управлял скрипт найден в ответе на этот вопрос,
и программа появляется, когда я Right Click->Properties->Open With
но ничего не происходит, когда я нажимаю на файл. Я даже поместил программу в бесконечный цикл и проверил, работает ли она как процесс, но это не так. Почему программа вообще не вызывается? Или он вызывается и просто по какой-то причине сразу закрывается? Разве этот скрипт не делает все, что мне нужно? Есть ли дополнительные шаги, которые мне нужно предпринять? Стоит ли пытаться зарегистрировать программу и связать ее с расширением файла другим способом?
Я нахожусь на Ubuntu.
Вы можете просто открыть терминал и исследовать среду:
int main(int argc, char** argv) {
std::system("gnome-terminal");
}
Других решений пока нет …