1

現在、USB ポートをスキャンする必要があるエージェント「Agent.app」を開発しています。USB デバイスが検出されると、アプリは「Filebrowser.app」というアプリケーションを起動します。

複数のアプリを避けるために、Agent.app を Filebrowser.app 内に配置する必要があります。

私の最初のアプリ FileBrowser は、QT Creator の下で Qt/c++ で開発されています。Qt Creator で Agent.app も開発しましたが、Qt とは関係のない単なる C++ クラスです。

FileBrowser.app に確実に含まれるようにするには、FileBrowser.pri 内で宣言された agent.pri が必要だと思います。

私がエージェントで行ったことは次のとおりです。

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 つの質問があります。

  • エージェントが 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 フォルダーに移動します。これを行うには、シェル コマンドまたは 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".

2 番目のステップは、その文字列から 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 に答える