Est-il utile de marquer une interface dérivée d'IUnknown comme double dans IDL?
-
06-07-2019 - |
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
?
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.
[dual]
n'exige techniquement pas que vous dériviez de IDispatch
tant que vous implémentez votre interface personnalisée et < code> IDispatch ?