2017-03-24 6 views
1

Ich habe ein ATL-Projekt, das ein COM-Objekt verfügbar macht. Ich möchte, dass mein COM-Objekt von Zeit zu Zeit eine vom Verbraucher angegebene Funktion aufruft oder über andere Möglichkeiten, den Verbraucher von Zeit zu Zeit zu benachrichtigen.Rückrufe in COM-Objekten

Ich habe versucht, eine Methode in CerberusNative.idl hinzuzufügen, um void Funktionszeiger zu nehmen, die ich von der COM-Instanz Seite der Dinge aufrufen möchte, so dass der Verbraucher das COM-Objekt bei der Initialisierung nur sagen müsste, was seine Rückrufe sind :

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

es jedoch einige Probleme mit meinen Leeren Funktionszeigern:

Severity Code Beschreibung Projektdatei Zeilenunterdrückungszustand Fehler MIDL2269 Prozeduren in einer Objektschnittstelle muss neu ein HRESULT drehen: [(Parameter 'userexit')] Fehler MIDL2131 Parameter muss keine Funktion sein: [Parameter 'userexit' Ordnung 'setCallbacks' (Interface 'ICerberusSession')]

Auf welche Weise kann ich eine Client-Anwendung abrufen, um Rückruffunktionen in meinem COM-Objekt zu abonnieren?

+0

Follow-up-Frage, ob jemand oder interessiert helfen kann: http : //stackoverflow.com/questions/43006702/setting-up-my-atl-com-callback-functions – Alexandru

Antwort

1

Der richtige Weg, es zu tun, ist eine separate Schnittstelle mit Methoden, sie zu definieren, und diese Schnittstelle in meine Setter-Methode weitergeben müssen:

[ 
    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); 
};