Как я могу открыть файл с моей собственной программой и заставить его вызвать другую программу?

задача:
Я хотел бы создать свое собственное расширение файла, чтобы при нажатии на определенный «точечный» файл моя программа открывала его. Тем не менее, эта программа, которую я написал, является просто посредником в том, что она будет выполнять некоторую обработку, но в конечном итоге передать этот файл другой программе для обработки.

пример:
Так, например, все простые текстовые файлы с расширением .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.

4

Решение

Вы можете просто открыть терминал и исследовать среду:

int main(int argc,  char** argv) {
std::system("gnome-terminal");
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]