在Qt应用程序中包含adb

时间:2014-05-25 05:17:26

标签: c++ qt qt5 qprocess qresource

我在OS X上使用Qt 5.3。我有一个依赖于android工具adb的程序,所以我试图将它作为资源包含。

在我的项目文件中,我有:

RESOURCES = app.qrc

在app.qrc中我有:

<!DOCTYPE RCC><RCC version="1.0">
<qresource>
    <file>assets/adb</file>
</qresource>

在我的应用中:

QResource::registerResource("app.rcc");

// I've run with and w/o a compiled .rcc file. No difference.

QProcess *kill_adb=new QProcess;
    kill_adb->start("/assets/adb kill-server");
    kill_adb->waitForFinished(-1);
    int exitcode = kill_adb->exitCode();

    QString s = QString::number(exitcode);
    QMessageBox::critical(
     this,
     tr("exit code:"),
     s);
    delete kill_adb;

对/ assets / adb的调用失败。如果我使用本地adb的路径,则代码可以正常工作。如何在程序中包含adb?

1 个答案:

答案 0 :(得分:0)

QProcess只能在您的文件系统上执行真实文件。如果您没有文件,则无法执行文件。

Gnu / Linux,Windows,Android,Mac等只能执行文件,因为它们是基于文件系统的操作系统。 QProcess遵循这一点,这就是它内部归结为至少在Linux上的原因:

static inline int qt_safe_execve(const char *filename, char *const argv[],
                                 char *const envp[])
{
    int ret;
    EINTR_LOOP(ret, ::execve(filename, argv, envp));
    return ret;
}

static inline int qt_safe_execv(const char *path, char *const argv[])
{
    int ret;
    EINTR_LOOP(ret, ::execv(path, argv));
    return ret;
}

static inline int qt_safe_execvp(const char *file, char *const argv[])
{
    int ret;
    EINTR_LOOP(ret, ::execvp(file, argv));
    return ret;
}

正如您所看到的,它将调用不同的exec *变体,然后通过相同的系统调用。它们都需要文件名。

如果没有直接或间接向最终用户提供适当的安装程序,唯一可以实现的方法是首先读取内容并将其写入临时文件中,如果你真的希望这样做的话。

话虽这么说,我个人会去寻找真正的安装程序。