COM自定义类中触发事件(在线等) 本帖最后由 mylife85 于 2011-03-10 12:03:06 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1。你是想myclass接收CFormUnity 的事件?CFormUnity 有事件吗?2。还是你想CFormUnity 支持事件?3。还是你想CFormUnity 接收其它组件的事件? 如果使用了连接点 直接调用 Fire_xxxx事件。 如果使用回调 自己的引出接口->xxxx事件。 给你<ATL开发指南>第7章的例子;// Chapter7_CallBackServer.idl : IDL source for Chapter7_CallBackServer.dll//// This file will be processed by the MIDL tool to// produce the type library (Chapter7_CallBackServer.tlb) and marshalling code.import "oaidl.idl";import "ocidl.idl"; [ object, uuid(48CD3740-50A3-11d1-B5EC-0004ACFF171C), helpstring("ICallBack Interface"), ] interface ICallBack : IUnknown { [helpstring("method ComputationComplete")] HRESULT ComputationComplete( long lResult ); }; [ uuid(DB5CCD8E-5489-11D1-883A-444553540000), helpstring("IMath Interface"), pointer_default(unique) ] interface IMath : IUnknown { [helpstring("method Add")] HRESULT Add([in] long lOp1,[in] long lOp2); [helpstring("method Subtract")] HRESULT Subtract([in] long lOp1,[in] long lOp2); [helpstring("method Multiply")] HRESULT Multiply([in] long lOp1,[in] long lOp2); [helpstring("method Divide")] HRESULT Divide([in] long lOp1,[in] long lOp2); [helpstring("method Advise")] HRESULT Advise([in] ICallBack* pCallBack); [helpstring("method UnAdvise")] HRESULT UnAdvise(); };[ uuid(DB5CCD81-5489-11D1-883A-444553540000), version(1.0), helpstring("Chapter7_CallBackServer 1.0 Type Library")]library CHAPTER7_CALLBACKSERVERLib{ importlib("stdole32.tlb"); importlib("stdole2.tlb"); [ uuid(DB5CCD8F-5489-11D1-883A-444553540000), helpstring("Math Class") ] coclass Math { [default] interface IMath; /* [source, default] */ interface ICallBack; };};// Math.cpp : Implementation of CMath#include "stdafx.h"#include "Chapter7_CallBackServer.h"#include "Math.h"/////////////////////////////////////////////////////////////////////////////// CMathSTDMETHODIMP CMath::Add(long lOp1, long lOp2){ long lResult = lOp1 + lOp2; if ( m_pCallBack ) m_pCallBack->ComputationComplete( lResult ); return S_OK;}STDMETHODIMP CMath::Subtract(long lOp1, long lOp2){ long lResult = lOp1 - lOp2; if ( m_pCallBack ) m_pCallBack->ComputationComplete( lResult ); return S_OK;}STDMETHODIMP CMath::Multiply(long lOp1, long lOp2){ long lResult = lOp1 * lOp2; if ( m_pCallBack ) m_pCallBack->ComputationComplete( lResult ); return S_OK;}STDMETHODIMP CMath::Divide(long lOp1, long lOp2){ long lResult = lOp1 / lOp2; if ( m_pCallBack ) m_pCallBack->ComputationComplete( lResult ); return S_OK;}STDMETHODIMP CMath::Advise(ICallBack * pCallBack){ m_pCallBack = pCallBack; return S_OK;}STDMETHODIMP CMath::UnAdvise(){ m_pCallBack = 0; return S_OK;}// Math.h : Declaration of the CMath#ifndef __MATH_H_#define __MATH_H_#include "resource.h" // main symbols/////////////////////////////////////////////////////////////////////////////// CMathclass ATL_NO_VTABLE CMath : public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CMath, &CLSID_Math>, public IMath{public: CMath() { m_pCallBack = 0; }DECLARE_REGISTRY_RESOURCEID(IDR_MATH)BEGIN_COM_MAP(CMath) COM_INTERFACE_ENTRY(IMath)END_COM_MAP()// IMathpublic: STDMETHOD(Add)(long lOp1, long lOp2); STDMETHOD(Multiply)(long lOp1, long lOp2); STDMETHOD(Subtract)(long lOp1, long lOp2); STDMETHOD(Divide)(long lOp1, long lOp2); STDMETHOD(Advise)(ICallBack* pCallBack); STDMETHOD(UnAdvise)();private: ICallBack* m_pCallBack;};#endif //__MATH_H_ 我想是myclass中执行CFormUnity 的事件, 我用了连接点 但是,我在自己的类里怎么执行Fire_xxxx事件呢 在自己的类里如myclass,不能直接执行Fire_xxxx事件编译器提示,找不到Fire_xxxx事件名我就郁闷这里了 我猜你没有实现连接点,没有把类和事件接口关联起来。 点到自己的类myclass, 右键菜单里 点 Implement Connection Point 在弹出的对话框内选择对应的接口,确认就可以了。如果没有错误应该在ClassView 里可以看到CProxy_事件接口<class T>, 其下包含Fire_XXX事件。 如果有错误或没正常生成,就没有 然后就可以在myclass里可以直接调用Fire_XXXX。 你可以搜索下ATL 实现连接点Implement Connection Point 的文章。 上面回复有点错误, 不好意思。 不知道myClass和CFormUnity 的关系是什么,CFormUnity * pUnity=(CFormUnity *) m_pUnity;pUnity->Fire_XXXX CFormUnity * pUnity=(CFormUnity *) m_pUnity;pUnity->Fire_XXXXm_pUnity从哪里来的 class ATL_NO_VTABLE CFormUnity :....{ CFormUnity(){}};class myclass{ void function() { //如何在触发触发事件 }};=========================你的类想进入事件触发,必须继承cmdtaget类,否则没戏! 正在做com的项目 你可以使用连接点 去看看杨老师的讲解吧 一个简单的问题? 请问,这个报错是什么意思呢?VC的,谢谢! 关于CFile的问题 在VC工程目录下,新建文件夹的问题。 在HOOK返回的虚拟键中,怎样得到CTRL、ALT、SHIFT键是否按下? 確認一下delete和free 字体缩放(不能有锯齿) VC++编译优化问题 这样的驱动该怎么写 我刚才中毒了,HappyTime, 幸亏金山毒霸 COM在辅助类中调用fire_xxx事件(在线等) 【急急急】我的菜单消失了,在线等。。。
2。还是你想CFormUnity 支持事件?
3。还是你想CFormUnity 接收其它组件的事件?
直接调用 Fire_xxxx事件。
如果使用回调
自己的引出接口->xxxx事件。
给你<ATL开发指南>第7章的例子;// Chapter7_CallBackServer.idl : IDL source for Chapter7_CallBackServer.dll
//// This file will be processed by the MIDL tool to
// produce the type library (Chapter7_CallBackServer.tlb) and marshalling code.import "oaidl.idl";
import "ocidl.idl"; [
object,
uuid(48CD3740-50A3-11d1-B5EC-0004ACFF171C),
helpstring("ICallBack Interface"),
]
interface ICallBack : IUnknown
{
[helpstring("method ComputationComplete")]
HRESULT ComputationComplete( long lResult );
}; [
uuid(DB5CCD8E-5489-11D1-883A-444553540000),
helpstring("IMath Interface"),
pointer_default(unique)
]
interface IMath : IUnknown
{
[helpstring("method Add")]
HRESULT Add([in] long lOp1,[in] long lOp2);
[helpstring("method Subtract")]
HRESULT Subtract([in] long lOp1,[in] long lOp2);
[helpstring("method Multiply")]
HRESULT Multiply([in] long lOp1,[in] long lOp2);
[helpstring("method Divide")]
HRESULT Divide([in] long lOp1,[in] long lOp2);
[helpstring("method Advise")]
HRESULT Advise([in] ICallBack* pCallBack);
[helpstring("method UnAdvise")]
HRESULT UnAdvise();
};
[
uuid(DB5CCD81-5489-11D1-883A-444553540000),
version(1.0),
helpstring("Chapter7_CallBackServer 1.0 Type Library")
]
library CHAPTER7_CALLBACKSERVERLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb"); [
uuid(DB5CCD8F-5489-11D1-883A-444553540000),
helpstring("Math Class")
]
coclass Math
{
[default] interface IMath;
/* [source, default] */ interface ICallBack;
};
};// Math.cpp : Implementation of CMath
#include "stdafx.h"
#include "Chapter7_CallBackServer.h"
#include "Math.h"/////////////////////////////////////////////////////////////////////////////
// CMathSTDMETHODIMP CMath::Add(long lOp1, long lOp2)
{
long lResult = lOp1 + lOp2; if ( m_pCallBack )
m_pCallBack->ComputationComplete( lResult ); return S_OK;
}STDMETHODIMP CMath::Subtract(long lOp1, long lOp2)
{
long lResult = lOp1 - lOp2; if ( m_pCallBack )
m_pCallBack->ComputationComplete( lResult ); return S_OK;
}STDMETHODIMP CMath::Multiply(long lOp1, long lOp2)
{
long lResult = lOp1 * lOp2; if ( m_pCallBack )
m_pCallBack->ComputationComplete( lResult ); return S_OK;
}STDMETHODIMP CMath::Divide(long lOp1, long lOp2)
{
long lResult = lOp1 / lOp2; if ( m_pCallBack )
m_pCallBack->ComputationComplete( lResult ); return S_OK;
}STDMETHODIMP CMath::Advise(ICallBack * pCallBack)
{
m_pCallBack = pCallBack;
return S_OK;
}STDMETHODIMP CMath::UnAdvise()
{
m_pCallBack = 0;
return S_OK;
}
// Math.h : Declaration of the CMath#ifndef __MATH_H_
#define __MATH_H_#include "resource.h" // main symbols/////////////////////////////////////////////////////////////////////////////
// CMath
class ATL_NO_VTABLE CMath :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CMath, &CLSID_Math>,
public IMath
{
public:
CMath()
{
m_pCallBack = 0;
}DECLARE_REGISTRY_RESOURCEID(IDR_MATH)BEGIN_COM_MAP(CMath)
COM_INTERFACE_ENTRY(IMath)
END_COM_MAP()// IMath
public:
STDMETHOD(Add)(long lOp1, long lOp2);
STDMETHOD(Multiply)(long lOp1, long lOp2);
STDMETHOD(Subtract)(long lOp1, long lOp2);
STDMETHOD(Divide)(long lOp1, long lOp2);
STDMETHOD(Advise)(ICallBack* pCallBack);
STDMETHOD(UnAdvise)();private:
ICallBack* m_pCallBack;
};#endif //__MATH_H_
但是,我在自己的类里怎么执行Fire_xxxx事件呢
点到自己的类myclass, 右键菜单里 点 Implement Connection Point 在弹出的对话框内选择对应的接口,确认就可以了。如果没有错误应该
在ClassView 里可以看到CProxy_事件接口<class T>, 其下包含Fire_XXX事件。
如果有错误或没正常生成,就没有 然后就可以在myclass里可以直接调用Fire_XXXX。 你可以搜索下ATL 实现连接点Implement Connection Point 的文章。
pUnity->Fire_XXXX
CFormUnity * pUnity=(CFormUnity *) m_pUnity;
pUnity->Fire_XXXXm_pUnity从哪里来的
{
CFormUnity(){}
};
class myclass
{
void function()
{
//如何在触发触发事件
}};
=========================
你的类想进入事件触发,必须继承cmdtaget类,否则没戏!