Question

En examinant notre code, j'ai trouvé une définition curieuse dans l'un des fichiers .idl:

[
    object,
    uuid(uuidhere),
    dual,
    nonextensible,
    oleautomation,
    hidden
]
interface IOurInterface : IUnknown {
    //methods here
};

Comment une interface dérivée directement de IUnknown peut-elle être une interface double? Est-ce que quelque chose se brise si je supprime l'attribut dual ?

Était-ce utile?

La solution

Dans cette réponse à une autre question concernant le marshaling, user voyce pointe vers cet article qui stipule ce qui suit:

Lorsqu'une interface (dérivée ou non d'IDispatch) est marquée dual ou oleautomation (ou les deux), elle est traitée spécialement lorsque RegisterTypeLib () est appelé (ce qui est généralement effectué par DllRegisterServer). Pour chaque interface de ce type, une clé HKCR \ Interface {InterfaceId} est créée sous laquelle la classe {00020424-0000-0000-C0000-000000000046} est référencée comme proxy / stub. Cet identifiant de classe correspond à typelib marshaller, également appelé oleautomation marshaller.

Autres conseils

Je ne vois pas pourquoi cela fonctionnerait, étant donné la documentation ici: http://msdn.microsoft.com/en-us /library/aa366807(VS.85).aspx

  

Interfaces identifiées par le double   attribut doit être compatible avec   Automatisation et être dérivé de   IDispatch. Cet attribut n'est pas   autorisé sur les dispinterfaces.

Il se peut que l'attribut [dual] ajoute implicitement IDispatch à l'interface.

Ce que vous pourriez faire est de vérifier le code implémentant l'interface (en supposant qu'il s'agisse d'ATL) s'il dérive de IDispatchImpl . Si tel est le cas, il répond effectivement à QI pour IDispatch et peut être utilisé en tant que tel.

Une autre alternative consiste à instancier un objet implémentant IOurInterface et à le QI pour IDispatch - s'il réussit, vous ne pourrez probablement pas le supprimer.

En fait, à bien y penser, peut-être que [dual] n'exige techniquement pas que vous dériviez de IDispatch tant que vous implémentez votre interface personnalisée et < code> IDispatch ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top