Используйте личную программу в Firebreath

Я создаю плагин, используя Firebreath. Я создал личный метод в ABCPluginAPI.cpp под названием exe_program(), и я хотел бы вызвать другую программу с помощью popen под названием my_program. Все файлы находятся в firebreath/projects/ABCPlugin/.

Мой метод:

string ABCPluginAPI::exe_program()
{
    FILE * pPipe;
    fd_set readfd;
    char buff[1024];
    char command[128];
    int ret;

    strcpy(command, "my_program");

    if (!(pPipe = popen(command, "r"))) {
         // Problem to execute the command
       return "failed";
    }
    while(fgets(buff, sizeof(buff), pPipe)!=NULL){
        cout << buff;
        return buff;
    }
}

У меня проблема в том, что плагин не работает my_program, на самом деле, если я выполняю команду pwd, он показывает мой каталог $ HOME. pwd работает, потому что это общая команда, но я не хочу помещать свою программу в переменную $PATH, потому что этот плагин должен быть переносимым.

Вероятно, Firebreath использует специальный каталог для ссылок на такие файлы или что-то подобное.


person Gabriel Muñumel    schedule 25.03.2012    source источник


Ответы (1)


Вероятно, вам потребуется указать полный путь и имя файла приложения, которое вы хотите запустить; не гарантируется, что текущий рабочий каталог всегда будет одним и тем же значением.

Со страницы Советы и рекомендации на сайте firebreath.org. это код, который вы можете добавить к объекту, производному от PluginCore, который даст вам полный путь и имя файла вашего плагина:

// From inside your Plugin class (that extends PluginCore)
std::string MyPlugin::getFilesystemPath()
{
    return m_filesystemPath;
}

Вы можете выбрать этот путь, удалить последнюю часть и изменить ее на имя исполняемого файла; пока вы помещаете исполняемый файл в тот же каталог, что и ваш плагин, он должен работать нормально. В качестве альтернативы вы можете установить его в каком-нибудь другом известном месте.

Обратите внимание, что для вызова метода вашего основного объекта Plugin из вашего объекта JSAPI должен быть вспомогательный метод getPlugin() в вашем объекте JSAPI (если вы использовали fbgen для его создания):

std::string pluginPath = getPlugin()->getFilesystemPath();

надеюсь, это поможет

person taxilian    schedule 26.03.2012
comment
pluginPath показал мне: $HOME/Documents/firebreath/build/bin/ABCPlugin, я поместил туда свой исполняемый файл и вызвал его, но это не сработало. На самом деле я также пытаюсь использовать исполняемый файл pwd в этой папке, но это не сработало. Я вызывал с ./pwd и с абсолютным путем $HOME/Documents/firebreath/build/bin/ABCPlugin/pwd. Спасибо за помощь таксисту. - person Gabriel Muñumel; 27.03.2012
comment
попробуйте запустить firefox из окна консоли и/или с параметром -g (чтобы поместить его в отладчик); в консоли и определенно с -g вы должны получить вывод stdout, чтобы вы могли обнаружить сообщение об ошибке - person taxilian; 27.03.2012
comment
Ну, у меня была небольшая путаница между путем, но в конце концов он заработал. Спасибо за помощь. - person Gabriel Muñumel; 28.03.2012