2010-07-19 5 views
0

콜백 함수를 설정해야하는 dll이 있습니다. 실제로 카메라 sdk이고 그림을받을 때 콜백 함수가됩니다. 여러 개의 (사용자 입력) 카메라를 갖고 싶지만 할 수 없습니다. 알 수없는 콜백 함수를 만들어야하기 때문에.C++ 다중 콜백 함수

쉬운 방법은 콜백 함수가있는 클래스 (카메라)를 만드는 것입니다. 하지만 dll 클래스의 멤버 포인터를 전달할 수 없습니다 (이미지 (*) 만 허용) (void *) *

가능한 해결책은 있습니까?

+0

컨텍스트 인수를 전달할 가능성이 없으면 운이 없습니다. 어쩌면'image *'매개 변수는 컨텍스트를 식별하는 데 사용할 수있는 데이터를 가지고 있을까요? –

답변

0

카메라 SDK는 여러 카메라 연결을 지원합니까? 그렇지 않다면 SDK 공급자와상의해야합니다.

SDK가 다중 연결을 지원하면 콜백 기능에서 카메라를 인식하는 방법을 제공해야합니다. 그러나 실제 답변은 SDK 자체에 있습니다. "이미지"유형이 무엇입니까? 카메라 ID가 포함되어있을 수 있습니까? 클라이언트 코드가 콜백 가입을하면 카메라 ID가 제공 될 수 있습니까? 이 같은 것 :

 
void Callback0(image*); 
void Callback1(image*); 

SubscribeImageCallback(0, Callback0); // camera 0 
SubscribeImageCallback(1, Callback1); // camera 1 

실제 답변은 카메라 SDK 인터페이스에 따라 다릅니다.

+0

답변 해 주셔서 감사합니다. 카메라 ID를 인식 할 수있는 유일한 방법은 이미지의 메모리 주소입니다. 하지만 그것은 문제를 해결할거야 :) – MBZ

1

호출 할 모든 함수 개체의 전역 목록을 만든 다음 각 콜백을 필요한 데이터와 함께 호출하는 단일 함수를 추가하십시오. 다음과 같은 것 :

std::vector<ICallback*> g_callbacks; 

void callback_wrapper(image * image) 
{ 
    for(unsigned int i=0; i<g_callbacks.size(); ++i) 
    { 
    g_callbacks[i]->process(image); 
    } 
} 

그런 다음 SDK에서 사용하는 콜백을 callback_wrapper 함수로 설정합니다.

+0

답장을 보내 주셔서 감사합니다. 이렇게하면 모든 카메라가 모든 카메라의 모든 이미지를 받게됩니다! 각 카메라마다 고유 한 이미지 만 필요합니다. – MBZ

0

OS에 따라 각 콜백 객체에 대한 동적 함수를 만들 수 있습니다. 콜백에 값을 전달할 수있는 기능이없는 레거시 코드의 콜백에 대해서는이를 정확히 수행했습니다.

는 쉽게 볼 수 추가 매개 변수

void Call01020304() { 
    CallWithValue(0x01020304); 
} 

를 컴파일하고 어셈블리에 대한 진수보고와 실제 콜백 함수를 호출 라이브러리가 기대하는 유형의 작은 프로토 타입 전달 함수를 만듭니다. 상수가 어디에 있는지 분명해야합니다.

그런 다음 VirtualAlloc + PAGE_EXECUTE_READWRITE 또는 mmap + PROT_EXEC을 사용하여 실행할 수있는 메모리를 할당합니다. 할당은 일반적으로 4K 블록으로 이루어 지므로 함수를 관리하는 클래스를 만들어 많은 것을 한꺼번에 할당 할 수 있습니다.

고유 한 값으로 새로운 콜백 함수가 필요할 경우 적절하게 변경된 값을 가진 프로토 타입의 바이트를 실행 메모리에 복사하고 포인터를 콜백 함수로 반환하십시오.