2017-07-11 20 views
-1

私は別のアプリケーションの開発に役立つObjective CランタイムデバッグツールをSwiftで書いています。現在のところ、このツールはObjective Cランタイムの独自のインスタンスを使用して正常に起動するスタンドアロンのCocoaアプリケーションであり、多用されていません。Mac OS:別のCocoaアプリケーション内からCocoaアプリケーションを実行するにはどうすればよいですか?

がターゲットアプリケーションのランタイムを使用するように、ターゲットアプリケーションのメソッド呼び出しから開くことができるように変更したいと考えています。この要件は、新しいプロセスを開始するためにNSTaskに依存する解決策の使用を排除します。

どうすればこの問題を解決できますか?

編集:

私のデバッグツールはGUIアプリケーションです。通常は、main関数からNSAppliationMainを呼び出して起動します。メインバンドルのinfo.plistファイルからアプリケーションインスタンスを設定します。明らかに、メインバンドルのinfo.plistがデバッグされたアプリケーションではなく、ターゲットアプリケーションのinfo.plistであるため、NSApplicationMainを別のアプリケーションのコードから呼び出そうとすると、これは動作しません。

言い換えれば、私はメインのnibファイルからアプリケーションを手動で起動し、ターゲットアプリケーション内からウィンドウ、メニューバーなどを開くにはどうしたらいいですか?

+1

共有ライブラリ(フレームワーク)にすることはできますか? –

+0

@MartinR私は確かにすることができますが、私はしなかった場合、アプリケーションを正しく起動する方法を知らない – Alexander

+0

[質問](https://stackoverflow.com/questions/8475476/load-a-mac-binary-as-a) -dynamic-library)が役に立ちます。 – CRD

答えて

1

最後の一つの推測(コメントの後)のみ大まかなアウトラインに:

ステップ1:自分のNIB

のWindowsからあなたの窓をロードしますが、メインNIBから起動時にロードする必要はありません。必要に応じてプログラムでロードするメソッドです。例えば。 NSWindowController(1つのウィンドウを読み込む)とNSBundle(NIB全体を読み込みます)を参照してください。

ステップ1B:あなたがメインNIBでそれらを事前に定義するのではなく、あなたがプログラム的にそれらを追加することができ、あなたのコードのためのメニュー項目を希望する場合は動的メニュー/メニュー項目

を追加します。ウィンドウのようにNIBからメニュー全体をロードすることもできます。

ステップ2:これは、クライアントが呼び出すAPIである&制御デバッガ

を開始するためにAPIを記述します。デバッガの起動時にこのAPIを呼び出してテストしてください。

手順3:プロジェクトをフレームワークに変換します。

フレームワークには、コードとNIBの両方が含まれます。

手順4:別のアプリでフレームワークを使用し、APIを呼び出します。

HTH

+0

ありがとう!私は時間を取るときにこれを撃つだろう。 1つのアプリケーションに2つのドックアイコン、2つのメニューバー、2つのメインウィンドウなどがあり、共有されたobjcランタイムがあるかどうか知っていますか? – Alexander

+0

そのためには、Xcodeで使用されるlldbのような*別個の*アプリケーションにアクセスして制御できる実際のデバッガを構築する必要があります。 – CRD

+0

どうすればそれをやり遂げることができますか? 1つは、SIPは別のアプリケーションのメモリ空間に干渉しようとする試みを無効にしませんか? – Alexander