2009-11-20 6 views
1

나는 맥과 HID 제어를 구현하기 위해 고군분투 : 나는 아래 여기에 도시 된 바와 같이 예상 기능 보낼 수 없습니다 :이 기능은 IOHIDManagerRegisterDeviceMatchingCallback이 코코아 환경에서 작동합니까?

IOHIDManagerRegisterDeviceMatchingCallback (gIOHIDManagerRef, Handle_DeviceMatchingCallback, NULL을); 와

: gIOHIDManagerRef ->이 루틴 Handle_DeviceMatchingCallback 전용 유효한 HID 관리자 - 여기에 사용하지> 포함 - HID의 장치가 NUUL가 의 USB 포트에 연결되어있는 경우 다시 호출됩니다> 루틴 USB의 데이터 Handle_DeviceMatchingCallback은 루틴에 대한 포인터 여야하지만 문제는 포인터를 보낼 수 있습니까? 반면에, 애플 소스의 모든 예제는 코코아가 아닌 C를 기반으로합니다. 글쎄, 그건 내 프로그램을 C에서 재 작업해야한다는 뜻인가요 ??? 또는 코코아 환경에서 C로 프로그램의 일부를 가질 수 있습니까? "바보 같은"질문 쿼리에 대해 유감스럽게 생각합니다. 그러나 전자 프로그래밍 분야에 대한 배경 지식이 있지만, 코코아를 사용하는 것은 아주 새로운 일입니다. 귀하의 의견은 매우 높이 평가됩니다!

마이클

+0

안녕, 은 신속한 답변에 감사드립니다. 불행히도 C와 코코아를 결합 할 때 나는 나쁜 결과를 낳았습니다. Apple에서 제공하는 새로운 HID 도구 (API)를 사용하려고하면 실제로 잃어 버렸습니다. 포인터가있는 문제 만이 아니며 일부 코드가 이미 사용되었는지 궁금합니다. 임시로이 코드를 C 형식으로 된 별도의 파일에 넣었고 예상대로 NS에 대한 모든 호출이 비참하게 실패합니다. 추가 제안 사항이 있으십니까? 아이디어? 읽기 링크? – Michael

답변

1

Handle_DeviceMatchingCallback는 루틴에 대한 포인터해야하지만 어떻게 나는 포인터를 보낼 수 있습니까? 당신이 함수 functionName에 전달하려는 경우

, 당신은 &functionName로 전달할 수 있습니다.

반면에, Apple 소스의 모든 예제는 C를 기반으로하며, 코코아를 기반으로하지는 않습니다. 글쎄, 그건 내가 C에서 내 프로그램을 다시해야한다는 것을 의미합니까 ??? 또는 코코아 환경에서 C로 프로그램의 일부를 가질 수 있습니까?

C와 Objective-C를 마음대로 사용할 수 있습니다. 함수를 전달하면 객체에 첨부 된 메서드가 아닌 이 작동해야합니다.

2

Objective-C는 대부분 C의 수퍼 세트입니다. C와 Objective-C 코드를 결합하려면 단순히 Objective-C 코드 인 것처럼 C 코드를 컴파일하면됩니다. Xcode에서이 작업을 수행하는 가장 쉬운 방법은 해당 파일이 .m 확장자인지 확인하는 것입니다.

Objective-C 세계로 다시 라우팅하려면 Obj-C 개체에 대한 포인터가 필요합니다. 많은 콜백 기반 API를 사용하면 일반 포인터 (void *)를 제공하여 콜백을 할 때 다시 전달할 수 있습니다.,

  • context 또는
  • refconctx
  • userData
  • userInfo

콜백 API는 이것을 허용하지 않는 경우 ("참조 상수"에 대한) :이 인수는 몇 가지 일반적인 이름이있다 글로벌 포인터 나 룩업 테이블과 같이 객체에 콜백을 보내려면 좀 더 끔찍한 방법이 필요합니다.

사용중인 API에서 컨텍스트 포인터를 제공 할 수 있습니다. 코드를 다시 호출하면 콜백에 등록 할 때 사용한 포인터가 제공됩니다. 다음은 MyObjCClass 유형의 객체 (아래 -registerMatching 메서드 참조)에서 콜백을 등록한 다음 컨텍스트 포인터를 사용하여 처리를 위해 콜백을 등록한 객체로 콜백을 다시 라우팅하는 예제입니다 (자세한 내용은 Handle_DeviceMatchingCallback 함수의 컨텍스트 사용 참조). 바늘).

/*! @file C-ObjC-Callbacks.m 
* Demonstrates routing a C callback to an Obj-C object 
* using the callback's context pointer. 
*/ 
#import <Cocoa/Cocoa.h> 
#import <IOKit/hid/IOHIDManager.h> 

// Global HID manager reference. 
IOHIDManagerRef gIOHIDManager; 
// HID callback 
void Handle_DeviceMatchingCallback(void *context, 
            IOReturn result, 
            void *sender, 
            IOHIDDeviceRef device); 

@interface MyObjCClass : NSObject { 
} 
- (void)registerMatching; 
- (void)handleMatchingDevice:(IOHIDDeviceRef)device 
         sender:(void *)sender 
         result:(IOReturn)result; 
@end 

@implementation MyObjCClass 
- (void)registerMatching { 
    // Assume gIOHIDManager has already been created. 
    // Set up a device matching callback, providing a pointer to |self| as the context. 
    IOHIDManagerRegisterDeviceMatchingCallback(gIOHIDManager, 
              Handle_DeviceMatchingCallback, 
              (void *)self); 
} 

- (void)handleMatchingDevice:(IOHIDDeviceRef)device 
         sender:(void *)sender 
         result:(IOReturn)result { 
    // Do something... 
} 
@end 

void 
Handle_DeviceMatchingCallback(void *context, 
           IOReturn result, 
           void *sender, 
           IOHIDDeviceRef device); { 
    MyObjCClass *const myObject = (MyObjCClass *const)context; 
    [myObject handleMatchingDevice:device sender:sender result:result]; 
} 
+0

감사합니다. 정말 도움이되었습니다. 일단 내가 솔루션을 grokked 명백하지만, 정말, 정말 도움이! – tjarratt

관련 문제