2009-07-10 4 views
8

코코아는 CS3에서 trick of putting a Cocoa bundle inside the main Carbon plugin bundle으로 작업하고, Carbon에서로드하고 NSApplicationLoad()를 발행하는 데 사용됩니다. Photoshop CS3는 Carbon 전용이며 플러그인 번들을 언로드하는 데 사용되기 때문입니다.코코아 기반 Adobe Photoshop 플러그인 구현 방법

Photoshop CS4는 Cocoa를 사용하며 주 스레드의 고유 한 NSAutorelease 풀을 가지고 있습니다.

NSWindowController에 의해로드 된 매우 간단한 윈도우 기반 xibs/nibs가 바로 사용할 수있는 Photoshop CS4입니다.

하지만 윈도우의 컨트롤에 바인딩을 추가하기 만하면 창을 닫을 때나 두 번째로 플러그인을 사용할 때 또는 Photoshop 자체를 닫을 때도 재미있는 충돌이 발생할 수 있습니다.

일부 고급 코코아 기능을 사용할 때까지 모든 것이 제대로 작동하는 것처럼 보이는 이유는 무엇입니까? 나는 붙어있다.

EDIT : 저는 광 범위 한 문제인 "Photoshop CS3/CS4 플러그인에서 코코아를 사용하는 방법"에 대한 해결책을 찾았습니다. 아래를 참조하십시오.

답변

1

당신은 당신의 높으신 양반과 코코아 코드를 포함하는 새 로드 가능한 번들 대상을 만들어야합니다. 번들 제품을 번들 리소스 복사 단계에 추가하십시오. 그런 다음 몇 가지 컨트롤 코코아 창을로드하는 필터 플러그인에 대한 코드는 다음과 같습니다

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 - 플러그인에서 코코아 바인딩을 사용할 수있게 되었습니까? 탄소 충돌에 코코아에 관한 내 스택 오버플로 질문을 참조하십시오. 나는/그 안에 문제가 있고 어떤 내부 감사하겠습니다. –

0

저는 CS4 용 코코아 기반 플러그인을 작성하기 시작했습니다. 실제로,이 주제에 대한 정보는 거의 없으며, 내가가는 동안 알아 냈습니다.

  • 이 애플의 예에서 시작하고 텍스트에서 누락 된 몇 가지 작은 세부 사항이 있기 때문에 당신이 전체 프로젝트를 다운로드해야합니다 :

Carbon/Cocoa

  • 하면 중 하나를 선택은 Photoshop SDK 예제 (ColorMunger 사용)를 시작하고 간단하게 유지하십시오. Apple 예제를 템플릿으로 사용하여 "정보"대화 상자를 대체하십시오. 메모리 문제가없는 작업을 수행 한 후에는 반드시 작업해야합니다.

저는 10 년 동안 Java와 Ruby 프로그래머 였으므로, C/C++ foo는 녹슬었고, 제가가는대로 Objective C를 배우고 있습니다. 두 경우의 "잡았다"...

  • NIB/XIB 파일에 컨트롤러 개체를 만들지 마십시오. Apple 예제를 기반으로 컨트롤러가 init 메서드에서 NIB 파일을 열면 정말 재미있는 순환 루프가 생깁니다.
  • Apple 예제에서는 Carbon 기반 C 응용 프로그램에 Cocoa 항목을 포함시키고 있습니다. Adobe 예제는 모두 C++입니다. 헤더 파일에 extern "C"{}를 잊지 마세요.
0

CS2는 PowerPC Mach-O 코드를 CS3/CS4처럼 쉽게로드합니다. CS2에서이 코코아 접근법을 테스트 한 사람이 있습니까?

현재 CS2/CS3/CS4 용으로 Carbon을 사용합니다. 플러그인이로드되는 모든 곳에서 작동하도록 보장되어 있습니다. 물론 32 비트인지 64 비트인지에 관계없이 CS5의 코코아도 마찬가지입니다. http://forums.adobe.com/message/3256555#3256555

그래서 실제 거래는 여기에서 무엇 :

크리스 콕스는 코코아 CS5 이외의 작업에 대한 낙관적 아닌가요? 말의 입에서 조언을 무시하는 것은 꽤 어렵습니다.

관련 문제