100分求教 关于实现事件观察者的代码,简单有关问题
100分求教 关于实现事件观察者的代码,简单问题。
我较少接触COM编程。 现在有一个COM组件,使用的事件观察者的模式实现。
就是需要我从他提供的一个接口实现派生类,来达到我要处理的代码。 可以看到 接口是从 IDispatch 派生
struct __declspec(uuid("65ac2769-04d9-43d7-b4ea-b20d9d60ab58"))
IDevEventObserver : IDispatch
现在实现类需要从 IDevEventObserver 。 直接派生之后,因为IDevEventObserver是属于抽象类,需要在子类中实现诸如AddRef等方法才能实例化。
不知道我描述是否清楚。 请做过的兄弟给我提个醒,应该怎么做,如何做,多谢多谢。
struct __declspec(uuid("65ac2769-04d9-43d7-b4ea-b20d9d60ab58"))
IDevEventObserver : IDispatch
{
//
// Wrapper methods for error-handling
//
HRESULT OnAvailableChanged (
VARIANT_BOOL bIsAvailable );
HRESULT OnModeChanged (
enum PhoneMode pm );
//
// Raw methods provided by interface
//
virtual HRESULT __stdcall raw_OnAvailableChanged (
VARIANT_BOOL bIsAvailable ) = 0;
virtual HRESULT __stdcall raw_OnModeChanged (
enum PhoneMode pm ) = 0;
};
class IMyCls : public IDevEventObserver
{
...
}
另,还有一个问题,就是
HRESULT SetPhoneEventObserver (
VARIANT * obs );
接口的方法,obs是事件观察者,应该是一个从接口派生出来的类的实例,我怎么传递参数。
多谢各位兄弟姐妹。
------解决方案--------------------
帮顶一下
------解决方案--------------------
class IMyCls : public IDevEventObserver
{
...
}
这里面OnModeChanged 等实现是看你的逻辑,不难
关键是传Observer的接口指针给 IXXXSubject在 change的方法里调用该OnModeChanged方法
HRESULT SetPhoneEventObserver (
VARIANT * obs );
传递IUnknown或者IDispatch吧
------解决方案--------------------
用ATL,里面有IUnknow的默认实现,继承就行了
传IDispatch比较好
------解决方案--------------------
仔细看看连接点的编程方法,用这个实现起来很简单
------解决方案--------------------
------解决方案--------------------
http://www.vckbase.com/document/viewdoc/?id=1539
我较少接触COM编程。 现在有一个COM组件,使用的事件观察者的模式实现。
就是需要我从他提供的一个接口实现派生类,来达到我要处理的代码。 可以看到 接口是从 IDispatch 派生
struct __declspec(uuid("65ac2769-04d9-43d7-b4ea-b20d9d60ab58"))
IDevEventObserver : IDispatch
现在实现类需要从 IDevEventObserver 。 直接派生之后,因为IDevEventObserver是属于抽象类,需要在子类中实现诸如AddRef等方法才能实例化。
不知道我描述是否清楚。 请做过的兄弟给我提个醒,应该怎么做,如何做,多谢多谢。
struct __declspec(uuid("65ac2769-04d9-43d7-b4ea-b20d9d60ab58"))
IDevEventObserver : IDispatch
{
//
// Wrapper methods for error-handling
//
HRESULT OnAvailableChanged (
VARIANT_BOOL bIsAvailable );
HRESULT OnModeChanged (
enum PhoneMode pm );
//
// Raw methods provided by interface
//
virtual HRESULT __stdcall raw_OnAvailableChanged (
VARIANT_BOOL bIsAvailable ) = 0;
virtual HRESULT __stdcall raw_OnModeChanged (
enum PhoneMode pm ) = 0;
};
class IMyCls : public IDevEventObserver
{
...
}
另,还有一个问题,就是
HRESULT SetPhoneEventObserver (
VARIANT * obs );
接口的方法,obs是事件观察者,应该是一个从接口派生出来的类的实例,我怎么传递参数。
多谢各位兄弟姐妹。
------解决方案--------------------
帮顶一下
------解决方案--------------------
class IMyCls : public IDevEventObserver
{
...
}
这里面OnModeChanged 等实现是看你的逻辑,不难
关键是传Observer的接口指针给 IXXXSubject在 change的方法里调用该OnModeChanged方法
HRESULT SetPhoneEventObserver (
VARIANT * obs );
传递IUnknown或者IDispatch吧
------解决方案--------------------
用ATL,里面有IUnknow的默认实现,继承就行了
传IDispatch比较好
------解决方案--------------------
仔细看看连接点的编程方法,用这个实现起来很简单
------解决方案--------------------
------解决方案--------------------
http://www.vckbase.com/document/viewdoc/?id=1539