Pergunta

estou seguindo Este artigo Para registrar eventos do Sens via COM, mas acho que estou perdendo alguma coisa. Estou chamando o método SubscriTeEvents que o artigo diz para escrever, assim:

EventSystemRegistrar.SubscribeToEvents("ManagedSENS EventSubscriber", "ManagedSENS.SensLogonInterop", subscriptionViewerID, this, typeof(SensLogon));

o que leva a esse método ser chamado:

private static String GetInterfaceGuid(Type type)
{
    Object[] attributes = type.GetCustomAttributes(typeof(GuidAttribute), true);

    return String.Format("{{{0}}}", ((GuidAttribute)attributes[0]).Value);
}

O problema é que o tipo existe a classe senslogon que eles aconselham a escrever, mas não tem atributos, de modo que o método lança uma exceção. Os únicos atributos, que são, de fato, Guidattributes, que dizem escrever são nessas classes, que não têm nada a ver com a aula do Senslogon (pelo menos até onde eu sei):

[ComImport, Guid("4E14FBA2-2E22-11D1-9964-00C04FBBB345")]
class EventSystem { }
[ComImport, Guid("7542E960-79C7-11D1-88F9-0080C7D771BF")]
class EventSubcription { }
[ComImport, Guid("AB944620-79C6-11d1-88F9-0080C7D771BF")]
class EventPublisher { }
[ComImport, Guid("cdbec9c0-7a68-11d1-88f9-0080c7d771bf")]
class EventClass { }

Talvez eu esteja perdendo alguma coisa aqui? Eu deveria derivar dessas aulas ou algo assim? A classe senslogon é mostrada, mas não possui nenhum desses atributos.

Alguém fez algo semelhante para se registrar com eventos da COM, ou talvez possa ver onde eu segui o artigo de maneira inadequada?

Foi útil?

Solução 2

Eu descobri. Eu estava passando pelo tipoof (senslogon) para eventsystemregistrar.subScrinceToEvents, quando eu deveria estar passando pelo tipoof (isenslogon) (o isenslogon realmente tem um guidatribute sobre ele). Bobo me.

Outras dicas

Eu acho que seu código não é seguro, porque você está assumindo a chamada para type.GetCustomAttributes(...) trabalhou sem verificar .... eu iria embrulhar isso em um try/catch Block para ver o que está acontecendo ... e inspecione a exceção ...

private static String GetInterfaceGuid(Type type) 
{ 
    string sGuid = string.Empty;
    try{
        Object[] attributes = type.GetCustomAttributes(typeof(GuidAttribute), true); 
        if (attributes != null && attributes.Length >= 1){
           sGuid = String.Format("{{{0}}}", ((GuidAttribute)attributes[0]).Value); 
        }else{
           // FAIL!
        }
    }catch(System.Exception up){
        throw up;
    }
    return sGuid;
} 

Fiz o ess.dll ser registrado? Você pode ter que registrá -lo manualmente? Verifique o registro para o ID da classe em hkey_classes_root, veja o ID do typelib ... se eles não estiverem lá, emitir isso regsvr32 ess.dll Onde o arquivo DLL está localizado na pasta atual.

Espero que isso ajude, cumprimentos, Tom.

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