0

我正在关注这篇文章以通过 COM 注册 SENS 事件,但我认为我遗漏了一些东西。我正在调用文章说要编写的 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 事件,或者也许可以看到我在哪里不正确地遵循了这篇文章?

4

2 回答 2

1

我认为你的代码是不安全的,因为你假设调用type.GetCustomAttributes(...)工作没有检查......我会将它包装在try/catch块中以查看发生了什么......并检查异常......

私有静态字符串GetInterfaceGuid(类型类型)
{
    字符串 sGuid = string.Empty;
    尝试{
        Object[] 属性 = type.GetCustomAttributes(typeof(GuidAttribute), true);
        if (attributes != null && attributes.Length >= 1){
           sGuid = String.Format("{{{0}}}", ((GuidAttribute)attributes[0]).Value);
        }别的{
           // 失败!
        }
    }catch(System.Exception up){
        呕吐;
    }
    返回 sGuid;
}

有没有ess.dll被注册?您可能必须手动注册它?检查注册表中 HKEY_CLASSES_ROOT 下的那些类 ID,查看 typelib id ...如果它们不存在,那么regsvr32 ess.dll无论 dll 文件位于当前文件夹中的什么位置,都可以发出此问题。

希望这会有所帮助,最好的问候,汤姆。

于 2010-02-16T00:45:19.093 回答
0

我想到了。我将 typeof(SensLogon) 传递给 EventSystemRegistrar.SubscribeToEvents,而我应该传递 typeof(ISensLogon) (ISensLogon 确实有一个 GuidAttribute)。傻我。

于 2010-02-16T01:22:53.310 回答