2011-05-11 12 views
3

Macアプリケーションからクラスを読み込み、別のMacアプリケーションで使用する方法はありますか?アプリケーションをライブラリとして使用できますか(Mac、Objective-c)?

私は、MacアプリケーションのいくつかのクラスにアクセスするAutomatorアクションを作成したいと思います。これは私が理想的に行う方法のようです(つまり、あなたが私のアプリケーションを購入して、 Automatorアクションなど)

答えて

2

Applescriptからアクセス可能なアプリケーションから特定の動作を実行できますが、実際のクラスにアクセスすることは、あなたが意味するとは思えません。実行中のアプリケーションのメモリにロードされたクラスにアクセスするという印象を受けます。これは、OS X(またはUNIXのようなシステム)では不可能です。アプリケーションはユーザーレベルで実行されます。ユーザーレベルのプロセスは、他のプロセスからメモリを読み取ることができません。このようなことを行う必要があるOSのコンポーネントは、カーネルレベルで実行されます。

コードを再利用しようとしている場合、静的ライブラリに共有する部分を作成し、他の部分とリンクしてコードを共有することができます。

EDIT:

あなたがAppleScriptを介して、それがアクセスできるようになり、同じアプローチを使用し、OBJの-Cを経由して、それがアクセスできるようにすることができているようですNSGodの答えから。それはかなりクールだ。

+1

実行中のアプリケーションから何もロードしたくありません。私は静的ライブラリとして私のアプリケーションを使用することができますか、私は私のアプリケーションと私の両方の自動アクションからアクセスする静的ライブラリを作成する必要がある場合は私は思っていますか? –

+1

ああ、静的ライブラリを構築し、そのライブラリにリンクしたいと思うでしょう。実行可能バイナリファイルはライブラリとは異なります。どちらもコンパイルされたコードを含んでいますが、別の形式です。実行可能ファイルにリンクすることはできません。希望が役立ちます。乾杯:) –

4

あなたのやりたいこと(私ははっきりしていません)に応じて、Serviceがあなたのためにこのトリックを行うかもしれません。共有ペーストボードを使用して、アプリケーションでデータを前後に渡すことができるヘルパーアプリを作成します。 NSPasteboardWritingNSPasteboardReadingプロトコルに準拠するオブジェクトを渡すことができるため、かなり広い範囲のアクションを取得できます。 NSStringNSAttributedStringNSURLNSColorNSSoundNSImageはすでにご利用いただけると思いますが、もちろんあなたのニーズに合ったカスタムクラスを作成することもできます。

2

distributed objectsをご覧ください。アプリケーションでは、Automatorアクションで使用できるオブジェクトを1つ以上販売することができます。私はAutomatorでそれを試したことはありませんが、近年注目されていない非常にエレガントなシステムです。私はそれが一見価値があると思う。

分散オブジェクトの優れた点の1つは、アプリケーションを同じコンピュータ上で実行している可能性がありますが、別のコンピュータ、おそらく非常に離れているアプリケーションでも簡単に実行できます。

2

基本的には、実行可能ファイルにリンクすることはできません。

アプリケーションバイナリは特定の形式です。 その形式は静的または共有ライブラリ形式とは異なります。

つまり、ライブラリと同様に、アプリケーションバイナリからコード部分をロードすることはできません。

3

スタンドアロンのAutomatorプラグインプロジェクトを作成しようとしましたか、Automatorバンドルターゲットをアプリケーションのプロジェクトに追加しようとしましたか?

メインアプリケーションのAutomatorアクションを作成したいと思っていますが、これらのアクションをアプリケーション(またはアプリケーションに含まれるクラス)とやりとりする方法が不明です。

Automatorアクションには、AppleScriptベース、シェルスクリプトベース、およびObjective-Cベースの3つの基本的なタイプがあります。Objective-Cをベースにして、メインアプリケーションのObjective-Cコードをアクション自体に簡単に組み込むことができます(Implementing an Objective-C Action参照)。 (デフォルトでは、オートマティックバンドルの新しいターゲットを追加するときはAMAppleScriptActionタイプです)。

Objective-Cの自動化アクションがAppleScriptベースのアクションと比べてどのように設定されているかを確認するには、独立したスタンドアロンプ​​ロジェクトを作成してみてください。

あなたのアプリがドキュメントベースで、という名前のメソッドを公開するKWDocumentクラスを使用しているとします。あなたのアプリが登録されているかどうかを知っているKWRegistrationManagerもあります。そして、「文書を複製するオブジェクト」と呼ばれるオートメーションアクションを作成したいとしましょう。アクションはKWDuplicateObjectsToDocumentに実装されます。サブタイプはAMBundleActionです。 Duplicate Objects to Document.actionのInfo.plistでは、NSPrincipalClassKWDuplicateObjectsToDocumentになります。

KWDuplicateObjectsToDocument.hのようなものになります。

#import <Cocoa/Cocoa.h> 
#import <Automator/AMBundleAction.h> 

@interface KWDuplicateObjectsToDocument : AMBundleAction { 

} 

- (id)runWithInput:(id)input fromAction:(AMAction *)anAction 
            error:(NSDictionary **)errorInfo; 

@end 

をそして、あなたのKWDuplicateObjectsToDocument.mは次のようなものになります。

#import "KWDuplicateObjectsToDocument.h" 
#import "KWDocument.h" 
#import "KWRegistrationManager.h" 


@implementation KWDuplicateObjectsToDocument 

- (id)runWithInput:(id)input fromAction:(AMAction *)anAction 
      error:(NSDictionary **)errorInfo { 
     if (![[KWRegistrationManager defaultManager] isRegistered]) { 
      return nil; 
     } 

    // eventually you'll call 
    // duplicateObjects:toDocument: 

     return input; 
} 

@end 

はあなたが必要なクラスを使用すると、(そのようKWRegistrationManagerとして使用していることを確認する必要がありますが、KWDocumentなど)がコンパイルされ、このバンドルのビルドプロセスの一部として組み込まれます。

関連する問題