本帖最后由 mylife85 于 2011-03-10 12:03:06 编辑

解决方案 »

  1.   

    1。你是想myclass接收CFormUnity 的事件?CFormUnity 有事件吗?
    2。还是你想CFormUnity 支持事件?
    3。还是你想CFormUnity 接收其它组件的事件?
      

  2.   

    如果使用了连接点 
        直接调用 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_
            
     
      

  3.   

    我想是myclass中执行CFormUnity 的事件,
      

  4.   

    我用了连接点 
    但是,我在自己的类里怎么执行Fire_xxxx事件呢
      

  5.   

    在自己的类里如myclass,不能直接执行Fire_xxxx事件编译器提示,找不到Fire_xxxx事件名我就郁闷这里了
      

  6.   

    我猜你没有实现连接点,没有把类和事件接口关联起来。 
    点到自己的类myclass, 右键菜单里 点  Implement Connection Point 在弹出的对话框内选择对应的接口,确认就可以了。如果没有错误应该
    在ClassView 里可以看到CProxy_事件接口<class T>, 其下包含Fire_XXX事件。 
    如果有错误或没正常生成,就没有 然后就可以在myclass里可以直接调用Fire_XXXX。 你可以搜索下ATL 实现连接点Implement Connection Point 的文章。 
      

  7.   

    上面回复有点错误, 不好意思。  不知道myClass和CFormUnity 的关系是什么,CFormUnity * pUnity=(CFormUnity *) m_pUnity;
    pUnity->Fire_XXXX
      

  8.   


    CFormUnity * pUnity=(CFormUnity *) m_pUnity;
    pUnity->Fire_XXXXm_pUnity从哪里来的
      

  9.   

    class ATL_NO_VTABLE CFormUnity :....
    {
      CFormUnity(){}
    };
    class myclass
    {
      void function()
      {
      //如何在触发触发事件
      }};
    =========================
    你的类想进入事件触发,必须继承cmdtaget类,否则没戏!
      

  10.   

    正在做com的项目  你可以使用连接点  去看看杨老师的讲解吧