2009-07-10 40 views
8

可可曾用CS3与trick of putting a Cocoa bundle inside the main Carbon plugin bundle一起工作,从Carbon加载并发布NSApplicationLoad()。这是因为Photoshop CS3是Carbon-only并用于卸载插件包。如何实现基于可可的Adobe Photoshop插件

Photoshop CS4使用Cocoa并在主线程上有自己的NSAutorelease池。

在Photoshop CS4上,一个NSWindowController加载的非常简单的基于窗口的xibs/nib可以开箱即用。

但是,只需在窗口中添加一个绑定到控件上,就可以在关闭窗口时,或者第二次使用插件时,或者甚至在关闭Photoshop本身时,获得有趣的崩溃。

为什么一切似乎都很好,直到我使用一些先进的可可功能?我卡住了。

编辑:我真的发现自己解决了更广泛的问题“如何在Photoshop CS3/CS4插件中使用可可?”。见下文。

回答

1

您必须创建一个新的可装载包包含您的笔尖和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 bundle trick。我仍在测试它,但它应该可以在CS3和CS4上运行。

+0

@IlDan - 你能够让可可绑定在你的插件中工作吗?看到我的堆栈溢出问题关于可可碳在碰撞中。我遇到了麻烦,而且任何内部都将不胜感激。 – 2009-11-09 20:58:22

0

我刚开始着手为CS4编写一个基于可可的插件。真的,关于这个话题几乎没有任何信息,我一直在解决它。

  • 开始从这款苹果例子,并确保您下载整个项目,因为有几个小细节,从文本丢失:

Carbon/Cocoa

  • 选择的一个Photoshop SDK示例(我使用了ColorMunger),并保持简单启动,因此只需使用Apple示例作为模板替换“关于”对话框即可。一旦你没有记忆问题的工作,你应该在你的路上。

我已经是Java和Ruby程序员已经有10年了,所以我的C/C++ foo已经生锈了,我只是在学习Objective C。我碰到两个“陷阱”,以防万一......

  • 不在您的NIB/XIB文件中创建一个控制器对象。因为,基于这个Apple例子,控制器在它的init方法中打开NIB文件,并且你得到一个非常有趣的递归循环
  • Apple示例将Cocoa内容嵌入到基于碳的C应用中。 Adobe的例子都是C++。不要忘记你的头文件中的extern“C”{}。
0

CS2将像CS3/CS4一样轻松加载PowerPC Mach-O代码。有没有人在CS2中测试过这种可可方法?

目前我使用碳为CS2/CS3/CS4,因为这是保证在插件加载的任何地方工作;和可可CS5当然是32位还是64位。

克里斯·考克斯是不看好可可比CS5以外的任何工作: http://forums.adobe.com/message/3256555#3256555

那么,这里是真正的交易吗?很难忽略来自马嘴的建议。