2009-10-28 12 views
5

notre code en revue que j'ai trouvé une curieuse définition dans l'un des fichiers .idl:N'importe quel sens dans le marquage d'une interface dérivée IUnknown comme double dans IDL?

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

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

Répondre

3

En this answer à une autre question concernant marshaling user voyce points this article qui indique essentiellement les éléments suivants:

Quand une interface (IDispatch dérivées ou non) est marqué soit dual ou oleautomation (ou les deux) elle est traitée spécialement lorsque RegisterTypeLib() est appelée (ce qui est généralement effectué par DllRegisterServer). Pour chaque interface, 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 à marshaller typelib également connu sous le nom d'oleautomation marshaller.

+0

Ah oui, c'est vrai. Puisque vous avez déjà eu une «oleautomation», j'ai pensé que c'était implicite ... Je ne connaissais pas les détails exacts, donc, merci pour le suivi! –

+0

Et je pense toujours que vous devriez vous assurer que l'objet ne répond pas actuellement à QI pour 'IDispatch' avant de le supprimer. –

+0

Oui, je suis entièrement d'accord sur la réponse QI avec IDispatch. – sharptooth

1

Je ne vois pas une raison que cela pourrait fonctionner, étant donné les docs 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 dispinterfaces.

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

Ce que vous pouvez faire est de vérifier le code implémentant l'interface (en supposant que ce soit ATL) s'il dérive de IDispatchImpl. Si oui, il répond réellement à QI pour IDispatch et pourrait être utilisé comme tel. Une autre alternative est d'instancier un objet implémentant IOurInterface et QI pour IDispatch - s'il réussit, vous ne pouvez probablement pas le supprimer.

En fait, pensez-y, peut-être [dual] ne nécessite pas techniquement que vous dérivez de IDispatch tant que vous implémentez à la fois votre interface personnalisée et IDispatch?