2017-03-24 1 views
1

COM 개체를 노출하는 ATL 프로젝트가 있습니다. 내 COM 객체가 소비자가 수시로 지정한 함수를 호출하거나 때때로 소비자에게 알리는 다른 수단을 통해 호출하려고합니다.COM 개체의 콜백

CerberusNative.idl에 메서드를 추가하려했는데, 소비자가 COM 개체를 초기화 할 때 콜백이 무엇인지 알려주기 위해 COM 인스턴스 측에서 호출하고 싶은 void 포인터를 사용했습니다. : 다시해야한다 객체 인터페이스의

심각도 코드 설명 프로젝트 파일 라인 억제 상태 오류 MIDL2269 절차 :

interface ICerberusSession : IDispatch { 
    [id(5)] HRESULT SetCallbacks([in] void(*userExit)(int, char *), [in] void(*userAttemptingReconnection)(), [in] void(*userReconnected)()); 
}; 

하지만, 내 무효 함수 포인터 몇 가지 문제가있다 HRESULT를 돌려 : [(매개 변수 'USEREXIT')] 오류 MIDL2131 매개 변수 하지 함수해야합니다 : [프로 시저 'SetCallbacks' 의 매개 변수 'USEREXIT'(인터페이스 'ICerberusSession')] 어떤 방법으로

을 내 COM 개체에서 콜백 함수를 구독 할 클라이언트 응용 프로그램을 가져올 수 있습니까?

+0

후속 질문 사람이 돕거나 관심이 할 수있는 경우 : HTTP : //stackoverflow.com/questions/43006702/setting-up-my-atl-com-callback-functions – Alexandru

답변

1

그것의 방법과 별도의 인터페이스를 정의하고, 내 setter 메소드에 해당 인터페이스를 통과하는 것입니다 올바른 방법 :

[ 
    object, 
    uuid(AECE8D0C-F902-4311-A374-ED3A0EBB6B49), 
    dual, 
    nonextensible, 
    pointer_default(unique) 
] 
interface ICallbacks : IUnknown 
{ 
    [id(1)] HRESULT UserExit([in] int errorCode, [in] BSTR errorMessage); 
    [id(2)] HRESULT UserAttemptingReconnection(); 
    [id(3)] HRESULT UserReconnected(); 
}; 

[ 
    object, 
    uuid(B98A7D3F-651A-49BE-9744-2B1D8C896E9E), 
    dual, 
    nonextensible, 
    pointer_default(unique) 
] 
interface ICerberusSession : IDispatch { 
    ... 
    [id(5)] HRESULT SetCallbacks([in] ICallbacks* callbacks); 
}; 
관련 문제