我目前正在开发代理商" Agent.app"必须扫描你的usb端口,如果它检测到usb设备,app会启动一个名为" Filebrowser.app"的应用程序。
我希望位于Filebrowser.app内的Agent.app避免多个应用程序。
我的第一个应用程序FileBrowser是在QT创建者的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中,这是我能做的最糟糕的事情。
我有2个问题:
非常感谢
答案 0 :(得分:0)
我希望位于Filebrowser.app内的Agent.app避免多个应用程序。
您是否考虑过只有一个程序包含两个应用程序的功能,并选择(在main()内部)基于例如执行哪些功能。命令行参数?这将更容易实现,并且还会使您的安装包更小。那说......
如何确保agent.app将包含在FileBrowser.app?
中
编译两个程序后,将agent.app文件夹移动到FileBrowser.app/Contents/Resources文件夹中。您可以使用shell命令或bash脚本来执行此操作,或者只需右键单击FileBrowser.app图标,从菜单中选择“打开包”,然后打开Contents和Resources子文件夹并拖动agent.app in
如何允许agent.app在代理时启动FileBrowser.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
请注意,使用Qt的QProcess API启动FileBrowser进程可能比通过调用system()获得更好的行为 - 特别是,在FileBrowser进程退出之前,system()调用不会返回,这会产生冻结代理GUI的副作用。