2011-09-23 3 views
1

나는 USB 탐지를 위해 코코아 응용 프로그램을 구현하려고합니다. 사용자가 자동으로 감지 한 USB를 연결할 때마다이 전체 부분이 하나의 C 프로그램입니다 (보통 C).기본 C, xcode 프로젝트에서 Objective-C 클래스 호출

시스템에서 특정 USB 장치를 감지하면 시스템 기능을 사용하여 다른 응용 프로그램 (즉, 다른 코코아 응용 프로그램)을 호출하고 싶습니다. 그 응용 프로그램을 열지 만 사용자가 해당 USB 장치 (이 또한 C 프로그램에서 감지 됨)를 제거하면 자동으로 두 번째 응용 프로그램을 닫고 싶습니다.

또는 첫 번째 애플리케이션에 코코아 사용자 인터페이스/objective-c 클래스를 추가하면 C 프로그램 내부에서 해당 클래스를 호출 할 수 있습니까?

답변

0

예 가능합니다. 예를 들어 libdispatch/Grand Central Dispatch이 어떻게 이것을 관리하는지 볼 수 있습니다.

기본 개념은 C 라이브러리에 C 함수 포인터 + void 포인터를 전달하는 것입니다. 그리고 전달 된 함수에서 Obj-C 함수를 호출 할 수 있습니다. 예 :

struct test_s { 
    NSString *my_string; 
}; 

void my_function(void *data) { 
    struct test_s *context = data; 
    NSLog(@"%@", [@"Hello " stringByAppendingString:context->my_string]; 
} 

void main(void) { 
    struct test_s context = { @"World!" }; 

    /* dispatch_sync_f is a C function unaware of Obj-C */ 
    dispatch_sync_f(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
        &context, 
        my_function); 
} 
1

하나의 클래스는 NSDistributedNotificationCenter입니다. C 프로그램은 알림을 게시해야하고 다른 프로그램은 알림을 구독해야합니다. 시나리오는 다음과 같이 갈 것 :

  • 두 번째 응용 프로그램 : 출시로하는 수신 "USB 장치 제거"메시지 등록
  • C 프로그램 : dectect 제거 USB 장치
  • C 프로그램 : 포스트 통지가 "USB 장치 제거"
  • 두 번째 응용 프로그램은 :
  • 둘째 앱 통지 "제거 USB 장치를"수신 : 자체 물론

당신의 C 프로그램이 것을 종료 이제 객관적인 C 프로그램이되었습니다. C 대안 인 CFNotificationCenterGetDistributedCenter도 있습니다.

+0

당신이 원한다면 해결책을 원한다면 "받아 들일"수 있습니다. – aLevelOfIndirection

1

개체가 이미 있고 포인터를 전달할 수있는 경우 Objective-C 런타임 기능 objc_msgSend을 사용할 수 있습니다. 예 :

#include <objc/runtime.h> 
#include <objc/message.h> 

void sendDoneToApp(id app) 
{ 
    /* [app done]; */ 

    /* get selector for "done" */ 
    SEL doneSel = sel_registerName("done"); 

    /* cast objc_msgSend to the type we need */ 
    void (*sendNoArgsNoRet)(id obj, SEL selector) = (void (*)(id, SEL))objc_msgSend; 

    /* send the message */ 
    sendNoArgsNoRet(app, doneSel); 
} 
관련 문제