8

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

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

Photoshop CS4 では、NSWindowController によってロードされた非常に単純なウィンドウベースの xib/nib がそのまま使用できます。

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

いくつかの高度な Cocoa 機能を使用するまで、すべてがうまく機能しているように見えるのはなぜですか? 私は立ち往生しています。

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

4

3 に答える 3

1

ペン先とCocoaコードを含む新しいLoadableBundleターゲットを作成する必要があります。プラグインのバンドルリソースのコピーフェーズにバンドル製品を追加します。次に、いくつかのコントロールを備えた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;
}

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

于 2009-07-10T17:35:50.137 に答える
0

CS2は、PowerPCMach-OコードをCS3/CS4と同じくらい簡単にロードします。CS2でこのCocoaアプローチをテストした人はいますか?

現在、CS2 / CS3 / CS4にはCarbonを使用しています。これは、プラグインがロードされるすべての場所で機能することが保証されているためです。もちろん、CS5のCocoaは、32ビットでも64ビットでもかまいません。

Chris Coxは、CocoaがCS5以外で動作することについて楽観的ではありません:http: //forums.adobe.com/message/3256555#3256555

それで、ここでの本当の取引は何ですか?馬の口からのアドバイスを無視するのはかなり難しいです。

于 2010-11-03T17:18:50.400 に答える
0

CS4 用の Cocoa ベースのプラグインの作成に取り掛かりました。実際、このトピックに関する情報はほとんどありません。

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

カーボン/ココア

  • Photoshop SDK の例 (私は ColorMunger を使用しました) の 1 つを選び、簡単に開始できるようにします。そのため、Apple の例をテンプレートとして使用して、[バージョン情報] ダイアログ ボックスを置き換えてみてください。メモリの問題なしで動作するようになったら、あなたは道を進んでいるはずです.

私は Java と Ruby のプログラマーとして 10 年間働いているので、私の C/C++ foo はさびついており、Objective C を学習しながら学んでいます。念のため、私が遭遇した2つの「落とし穴」....

  • NIB/XIB ファイルにコントローラ オブジェクトを作成しないでください。そのAppleの例に基づいて、コントローラーはinitメソッドでNIBファイルを開き、非常に興味深い再帰ループを取得するためです
  • Apple の例では、Carbon ベースの C アプリに Cocoa を埋め込んでいます。Adobe の例はすべて C++ です。ヘッダー ファイルに extern "C" {} を忘れないでください。
于 2009-07-10T16:54:36.147 に答える