Hai senso nel contrassegnare un'interfaccia derivata da IUnknown come doppia in IDL?
-
06-07-2019 - |
Domanda
Esaminando il nostro codice ho trovato una definizione curiosa in uno dei file .idl:
[
object,
uuid(uuidhere),
dual,
nonextensible,
oleautomation,
hidden
]
interface IOurInterface : IUnknown {
//methods here
};
Come può un'interfaccia derivata direttamente da IUnknown
possibilmente essere una doppia interfaccia? Qualcosa si romperà se rimuovo l'attributo dual
?
Soluzione
In questa risposta a un'altra domanda riguardante il marshalling user voyce punta a questo articolo che afferma sostanzialmente quanto segue:
Quando qualsiasi interfaccia (derivata da IDispatch o meno) è contrassegnata con dual
o oleautomation
(o entrambi), viene trattata specialmente quando RegisterTypeLib () (che in genere viene eseguito da DllRegisterServer). Per ciascuna di tali interfacce viene creata una chiave HKCR \ Interface {InterfaceId} in base alla quale la classe {00020424-0000-0000-C0000-000000000046} viene definita proxy / stub. Questo ID di classe corrisponde al marshaller typelib noto anche come marshaller oleautomation.
Altri suggerimenti
Non riesco a vedere un motivo per cui funzionerebbe, dati i documenti qui: http://msdn.microsoft.com/en-us /library/aa366807(VS.85).aspx
Interfacce identificate dal doppio l'attributo deve essere compatibile con Automazione e derivazione IDispatch. Questo attributo non lo è consentito su dispinterfaces.
È possibile che l'attributo [dual]
aggiunga implicitamente IDispatch
all'interfaccia.
Quello che potresti fare è controllare il codice che implementa l'interfaccia (supponendo che sia ATL) se deriva da IDispatchImpl
. In tal caso, in realtà risponde al QI per IDispatch
e potrebbe essere usato come tale.
Un'altra alternativa è creare un'istanza di un oggetto che implementa IOurInterface
e QI per IDispatch
- se riesce, probabilmente non puoi rimuoverlo.
In realtà, pensaci, forse [dual]
non richiede tecnicamente che tu derivi da IDispatch
fintanto che implementi sia la tua interfaccia personalizzata che < code> IDispatch ?