Используйте персональную программу в Firebreath - PullRequest
0 голосов
/ 25 марта 2012

Я создаю плагин, используя 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 использует специальный каталог для ссылки на файлы такого типа или что-то подобное.

1 Ответ

1 голос
/ 26 марта 2012

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

На странице Советы и хитрости 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();

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

...