0

我正在使用 Firebreath 构建一个插件。我在ABCPluginAPI.cppcalled中创建了一个个人方法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 使用一个特殊的目录来引用这种文件或类似的东西。

4

1 回答 1

1

您可能需要指定要运行的应用程序的完整路径和文件名;当前工作目录不保证总是相同的值。

在 firebreath.org的Tips and Tricks页面中,您可以将代码添加到 PluginCore 派生对象中,该对象将为您提供插件文件的完整路径和文件名:

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

您可以采用该路径,去掉最后一部分,并将其更改为您的可执行文件名;只要您将可执行文件放在与插件相同的目录中,就可以正常工作。或者,您可以将其安装在其他知名位置。

请注意,要从 JSAPI 对象调用主 Plugin 对象上的方法,您的 JSAPI 对象上应该有一个辅助方法 getPlugin() (如果您使用 fbgen 生成它):

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

希望有帮助

于 2012-03-26T15:04:35.020 回答