Qualquer sentido na marcação de uma interface IUnknown derivado como dupla em IDL?
-
06-07-2019 - |
Pergunta
Revendo nosso código eu encontrei uma definição curiosa em um dos ficheiros.IDL:
[
object,
uuid(uuidhere),
dual,
nonextensible,
oleautomation,
hidden
]
interface IOurInterface : IUnknown {
//methods here
};
Como uma interface pode derivada diretamente da IUnknown
possivelmente ser uma interface dupla? Alguma coisa vai quebrar se eu remover o atributo dual
?
Solução
Na esta resposta a outra pergunta relativa aos pontos de empacotamento usuário Voyce para este artigo que, basicamente, afirma o seguinte:
Quando qualquer interface (IDispatch-derivada ou não) é marcado, quer dual
ou oleautomation
(ou ambos) é tratada especialmente quando RegisterTypeLib()
é invocado (o que é tipicamente realizado por DLLRegisterServer). Para cada tal interface de uma chave HKCR \ Interface {InterfaceId} é criado sob as quais {00020424-0000-0000-C0000-000000000046} classe é referenciado como proxy / topo. Este ID de classe corresponde a typelib marshaller também conhecido como marshaller oleautomation.
Outras dicas
Eu não posso ver uma razão para que isso iria funcionar, dadas as docs aqui: http://msdn.microsoft.com/en-us /library/aa366807(VS.85).aspx
Interfaces identificados pela dupla atributo deve ser compatível com Automação e decorrentes de IDispatch. Este atributo não é permitidos no dispinterfaces.
Pode ser que o atributo [dual]
acrescenta implicitamente IDispatch
à interface.
O que você poderia fazer é verificar o código que implementa a interface (assumindo que este é ATL) se deriva IDispatchImpl
. Se assim for, ele realmente responde a QI para IDispatch
e pode ser usado como tal.
Outra alternativa é instanciar um IOurInterface
implementação de objeto e QI-lo para IDispatch
-. Se for bem sucedido, você provavelmente não pode removê-lo
Na verdade, chegou a pensar sobre isso, talvez [dual]
tecnicamente não exigem que você derivar de IDispatch
enquanto você implementar tanto a interface personalizada e IDispatch
?