Перехват событий SENS в .NET, без атрибутов Guid - PullRequest
0 голосов
/ 16 февраля 2010

Я следую этой статье за регистрацией событий SENS через COM, но я думаю, что что-то упустил. Я вызываю метод SubscribeToEvents, который написано в статье, наподобие этого:

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

, что приводит к вызову этого метода:

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

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

Проблема в том, что есть тип класса SensLogon, который они советуют писать, но у него нет атрибутов, поэтому метод генерирует исключение. Единственные атрибуты, которые, по сути, являются GuidAttributes, которые, как говорят, пишут, относятся к этим классам, которые не имеют ничего общего с классом SensLogon (по крайней мере, насколько я могу судить):

[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 { }

Возможно, я что-то здесь упускаю? Я должен был извлечь из этих классов или что-то? Класс SensLogon показан, но у него нет ни одного из этих атрибутов.

Кто-нибудь делал что-то подобное, чтобы зарегистрироваться в COM-событиях, или, может быть, может посмотреть, где я неправильно прочитал статью?

Ответы [ 2 ]

1 голос
/ 16 февраля 2010

Я думаю, что ваш код небезопасен, потому что вы предполагаете, что вызов type.GetCustomAttributes(...) работал без проверки .... Я бы обернул это в блок try / catch, чтобы увидеть, что происходит ... и проверить исключение ...

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;
} 

ess.dll зарегистрировался вообще? Возможно, вам придется зарегистрировать это вручную? Проверьте реестр на наличие идентификаторов этих классов в разделе HKEY_CLASSES_ROOT, посмотрите на идентификатор typelib ... если их там нет, введите regsvr32 ess.dll везде, где файл dll находится в текущей папке.

Надеюсь, это поможет, С наилучшими пожеланиями, Том.

0 голосов
/ 16 февраля 2010

Я понял это.Я передавал typeof (SensLogon) в EventSystemRegistrar.SubscribeToEvents, когда я должен был передать typeof (ISensLogon) (ISensLogon действительно имеет атрибут GuidAttribute)Глупый я.

...