1

我目前正在开发一个代理“Agent.app”,它必须扫描您的 USB 端口,如果它检测到 USB 设备,该应用程序会启动一个名为“Filebrowser.app”的应用程序。

我希望 Agent.app 位于 Filebrowser.app 内以避免多个应用程序。

我的第一个应用 FileBrowser 是在 QT creator 下使用 Qt/c++ 开发的。我还在 Qt Creator 下开发了 Agent.app,但它只是一个与 Qt 无关的 C++ 类。

我想我需要在 FileBrowser.pri 中声明的 agent.pri 以确保 FileBrowser.app 将包含它。

我在代理中所做的是:

int main()
{
    PulsUsbDetection *MyUSBDevice = new PulsUsbDetection;

    if(MyUSBDevice->isPulsConnected() == true) {
        char *filepath = "/Applications/puls_connect.app";
        string command = "open " + filepath;
        system(command.c_str());
    }

    return 0;
}

这是我能做的最糟糕的事情,主要是如果应用程序不在 Application.app 中。

我确实有两个问题:

  • 当代理在 FileBrowser.app 内时,如何允许 agent.app 启动 FileBrowser.app ?
  • 如何确保 agent.app 将包含在 FileBrowser.app 中?

非常感谢

4

1 回答 1

0

我希望 Agent.app 位于 Filebrowser.app 内以避免多个应用程序。

您是否考虑过只有一个程序包含两个应用程序的功能,并根据例如命令行参数选择(在 main() 内部)执行哪些功能?这将更容易实现,并且还会使您的安装包更小。那就是说...

如何确保 agent.app 将包含在 FileBrowser.app 中?

编译这两个程序后,将 agent.app 文件夹移动到 FileBrowser.app/Contents/Resources 文件夹中。您可以使用 shell 命令或 bash 脚本来执行此操作,或者只需右键单击 FileBrowser.app 图标,从菜单中选择“打开包”,然后打开 Contents 和 Resources 子文件夹并将 agent.app 拖入.

当代理在 FileBrowser.app 内时,如何允许 agent.app 启动 FileBrowser.app ?

您要做的第一件事是找到“代理”可执行文件所在目录的路径。幸运的是,Qt 有一个方法可以做到这一点:您可以调用QApplication::applicationDirPath()

因此,例如,如果您的 FileBrowser.app 被放置在 /Applications 中,并且 agent.app 被放置在 FileBrowser.app/Contents/Resources 中(如上所述),那么上述函数调用将返回一个类似“/Applications/”的字符串FileBrowser.app/Contents/Resources/agent.app/Contents/MacOS”。

第二步是从该字符串派生 FileBrowser 应用程序的路径。这应该很简单:

// This code to be run in the agent app, to launch the FileBrowser app...
QString agentExecutableDirPath = QApplication::applicationDirPath();
QString fileBrowserExecutablePath = agentExecutableDirPath + "../../../../MacOS/FileBrowser";
system(QFile::encodeName(fileBrowserExecutablePath).constData());  // run it

请注意,与调用 system() 相比,使用 Qt 的QProcess API 启动 FileBrowser 进程可能会获得更好的行为——特别是,system() 调用在 FileBrowser 进程退出之前不会返回,这将产生副作用在此之前冻结您的代理 GUI。

于 2015-05-06T04:24:28.667 回答