質問

Cocoa は以前、CS3 で動作していました。 Cocoa バンドルをメインの Carbon プラグイン バンドル内に配置するトリック, 、CarbonからロードしてNSApplicationLoad()を発行します。これは、Photoshop CS3 が Carbon 専用であり、プラグイン バンドルをアンロードするために使用されていたためです。

Photoshop CS4 は Cocoa を使用し、メインスレッド上に独自の NSAutorelease プールを備えています。

Photoshop CS4 では、NSWindowController によって読み込まれた非常に単純なウィンドウベースの xib/nib がすぐに機能します。

しかし、ウィンドウ上のコントロールにバインディングを追加するだけでは、場合によってはウィンドウを閉じるとき、プラグインを 2 回目に使用するとき、または Photoshop 自体を閉じるときでも、おかしなクラッシュが発生します。

いくつかの高度な Cocoa 機能を使用しない限り、すべてがうまく機能しているように見えるのはなぜですか?行き詰まってしまった。

編集:私は、「Photoshop CS3/CS4 プラグインで Cocoa を使用するにはどうすればよいですか?」というより広範な問題に対する解決策を自分自身で見つけました。以下を参照してください。

役に立ちましたか?

解決

あなたのペン先とあなたのココアのコードを含む新しいのロード可能バンドルのターゲットを作成する必要があります。あなたのプラグインののコピーバンドルリソースの相にバンドル製品を追加します。その後、いくつかのコントロールとココアウィンドウをロードするフィルタプラグインのコードは次のようになります。

Boolean DoUI (void) {

    // Create the CF Cocoa bundle
    CFBundleRef pluginBundle;
    CFURLRef cocoaBundleURL;
    pluginBundle = CFBundleGetBundleWithIdentifier(CFSTR("com.example.plugin"));
    cocoaBundleURL = CFBundleCopyResourceURL(pluginBundle, 
                                             CFSTR("Cocoa_bundle"), 
                                             CFSTR("bundle"), 
                                             NULL);
    CFBundleRef cocoaBundleRef;
    cocoaBundleRef = CFBundleCreate(kCFAllocatorDefault, cocoaBundleURL);
    CFRelease(cocoaBundleURL);

    // start Cocoa (for CS3)
    NSApplicationLoad(); 

    NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

    // load the cocoa bundle by identifier
    NSBundle* cocoaBundle;
    cocoaBundle = [NSBundle bundleWithIdentifier:@"com.example.plugin.cocoa"];

    // load the window controller from the bundle
    Class testControllerClass;
    testControllerClass = [cocoaBundle classNamed:@"MyWindowController"];

    MyWindowController* winController = [[testControllerClass alloc] init];
    [NSApp runModalForWindow:[winController window]];
    [[winController window] performClose:nil];
    [winController release];

    // release the bundle
    CFRelease(cocoaBundleRef);

    [pool release];

    return 1;
}

これは<クレイグHockenberryがバンドルトリックに基づいています/>。私はまだそれをテストしていますが、それはCS3とCS4の両方で動作するはずです。

他のヒント

私はちょうど CS4 用の Cocoa ベースのプラグインの作成に取り組み始めたところです。実際のところ、このトピックに関する情報はほとんどなく、私は調べながら調べています。

  • この Apple の例から始めて、テキストには細かい詳細がいくつか欠けているため、必ずプロジェクト全体をダウンロードしてください。

カーボン/ココア

  • Photoshop SDK のサンプル (私は ColorMunger を使用しました) の 1 つを選択し、簡単に開始できるようにしてください。そのため、Apple のサンプルをテンプレートとして使用して、[バージョン情報] ダイアログ ボックスを置き換えてみてください。メモリの問題が発生せずに動作するようになれば、作業は完了です。

私は Java および Ruby プログラマーとして 10 年間働いているため、C/C++ foo は錆び付いており、目的の C を学習しているところです。念のため、私が遭遇した 2 つの「落とし穴」をご紹介します。

  • NIB/XIB ファイル内にコントローラー オブジェクトを作成しないでください。Apple の例に基づくと、コントローラーは init メソッドで NIB ファイルを開き、非常に興味深い再帰ループが得られるからです。
  • Apple の例では、Cocoa のものを Carbon ベースの C アプリに埋め込んでいます。Adobe のサンプルはすべて C++ です。ヘッダー ファイル内の extern "C" {} を忘れないでください。

CS2はCS3 / CS4として容易PowerPCのマッハ・O・コードをロードします。誰もがCS2で、このココアのアプローチをテストしていますか?

これはどこにでもプラグインの負荷を動作することが保証されるように、

現在、私はCS2 / CS3 / CS4用カーボンを使用します。もちろんCS5のためのココア、32または64ビットかどうか。

クリス・コックスは、ココアがCS5以外での作業について楽観的ではありません。 http://forums.adobe.com/message/3256555#3256555する

だからここに本物は何ですか?これは、馬の口からアドバイスを無視することはかなり難しいます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top