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

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

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

моя C++ программа для этого выглядит так:

#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.

1 ответ

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

int main(int argc,  char** argv) {
    std::system("gnome-terminal");
}
Другие вопросы по тегам