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?

Foi útil?

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?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top