我目前正在开发一个代理"Agent.app“,它必须扫描您的usb端口,如果它检测到usb设备,应用程序启动一个名为"Filebrowser.app”的应用程序。
我希望Agent.app位于Filebrowser.app内部,以避免多个应用程序。
我的第一个应用程序FileBrowser是在Qt/c++下在QT创建者下开发的。我还在Qt下开发了Agent.app,但它只是一个与Qt无关的C++类。
我想我需要在agent.pri中声明FileBrowser.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中的话。
我有两个问题:
非常感谢
发布于 2015-05-06 04:24:28
我希望Agent.app位于Filebrowser.app内部,以避免多个应用程序。
您是否考虑过只有一个程序包含两个应用程序的功能,并选择(在main()中)根据命令行参数执行哪些功能?这将更容易实现,并将使您的安装包小得多。上面说..。
如何确保agent.app将包括在FileBrowser.app中?
编译两个程序之后,将agent.app文件夹移到FileBrowser.app/Content/Resources文件夹中。您可以使用shell命令或bash脚本进行操作,或者只需右键单击FileBrowser.app图标,从菜单中选择"Open“,然后打开Contents子文件夹并拖动agent.app。
如何允许agent.app在代理位于FileBrowser.app内时启动FileBrowser.app?
首先要做的是找到您的“代理”可执行文件所在的目录的路径。幸运的是,Qt有一个这样的方法:您只需调用QApplication::applicationDirPath()。
因此,例如,如果您的"/Applications/FileBrowser.app/Contents/Resources/agent.app/Contents/MacOS".放在/Applications中,而agent.app放在FileBrowser.app /Content/Resources中(如上面所建议的那样),那么上面的函数调用将返回一个类似于/Applications的字符串
第二步是从该字符串派生到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的FileBrowser API启动QProcess进程的行为可能比调用system()更好--特别是,在FileBrowser进程退出之前,FileBrowser()调用不会返回,这在此之前会产生冻结代理GUI的副作用。
https://stackoverflow.com/questions/30064432
复制相似问题