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 ?

È stato utile?

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 ?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top