zoukankan      html  css  js  c++  java
  • Com开发之回调

     

    接前面两个例子:

    1.图文并茂 简单 ATL COM开发

    2.COM开发之结构体 

    本例讲述,C#调用com方法后,com在适当时机回调C#方法。

    具体为,c# 先加载一个回调,然后调用COM的add方法,COM把add操作执行后,sleep 1秒,然后触发回调,返回执行结果。

    打开项目FirstCom

    1.打开FistCom.idl,先增加一个回调定义,如下,其中uuid 需要用GUID工具来生成,这段代码必须在IFirstClass定义之前,否则编译可能会报错。

    [

             object,

             uuid(8900006b-5201-41bf-a08d-7d88fafd7fec)

    ]

    interface ICallBack:IUnknown{

             [id(1)]HRESULT Complete([in] LONG RetPara);

    };

    2.增加调用方法,如下,红色为新增部分:AddCallBack为加载一个回调函数,RemoveCallBack为卸载回调函数,AddWithCallBack为测试回调的方法。

    [

             object,

             uuid(645EE65A-27F6-406B-B2E8-7417660FE0E8),

             dual,

             nonextensible,

             pointer_default(unique)

    ]

    interface IFirstClass : IDispatch{

             [id(1)] HRESULT Add([in] LONG para1, [in] LONG para2, [out,retval] LONG* result);

             [id(2)] HRESULT TestStruct(struct FirstStruct* result);

             [id(3)] HRESULT AddCallBack([in]ICallBack*  _callBack);

             [id(4)] HRESULT RemoveCallBack(void);

             [id(5)] HRESULT AddWithCallBack([in] LONG para1,[in] LONG para2,[out,retval] LONG* result);

    };

    3.设置头文件FirstClass.h,在public方法里加入刚才定义的三个。

    public:

             STDMETHOD(Add)(LONG para1, LONG para2, LONG* result);

             STDMETHOD(TestStruct)(struct FirstStruct* result);

             STDMETHOD(AddCallBack)(ICallBack*  _callBack);

             STDMETHOD(RemoveCallBack)(void);

             STDMETHOD(AddWithCallBack)(LONG para1, LONG para2, LONG* result);      

    然后在私有变量里面,增加callBack变量,便于保存回调函数:

    class ATL_NO_VTABLE CFirstClass :

             public CComObjectRootEx<CComSingleThreadModel>,

             public CComCoClass<CFirstClass, &CLSID_FirstClass>,

             public IDispatchImpl<IFirstClass, &IID_IFirstClass, &LIBID_FirstComLib, /*wMajor =*/ 1, /*wMinor =*/ 0>

    {

    private:

             ICallBack* p_CallBack;

    public:

             CFirstClass()

             {

             }

    4.打开源文件FirstClass.Cpp,增加这三个方法的具体实现:

    STDMETHODIMP CFirstClass::AddCallBack(ICallBack* _callBack)

    {

             p_CallBack=_callBack;

             p_CallBack->AddRef();

                       return S_OK;

    }

     

    STDMETHODIMP CFirstClass::RemoveCallBack(void)

    {

             p_CallBack->Release();

             p_CallBack=0;

                       return S_OK;

    }

     

    STDMETHODIMP CFirstClass::AddWithCallBack(LONG para1, LONG para2, LONG* result)

    {

             *result=para1+para2;

             Sleep(1000); //1s

             p_CallBack->Complete(*result);

             return S_OK;

    }

    5.编译该项目,成功后,打开测试的WPF项目,首先定义一个回调,继承与刚才在Com中定义的接口ICallBack:

        public class FirstCallBack : FirstComLib.ICallBack

        {

            void FirstComLib.ICallBack.Complete(int RetPara)

            {

                Debug.WriteLine("CallBack" + RetPara);

                Debug.WriteLine("CallBack: " + DateTime.Now.ToString());

            }

    }

    然后测试该回调

    FirstComLib.FirstClassClass firstClass = new FirstComLib.FirstClassClass();

                 firstClass.AddCallBack(new FirstCallBack());

                Debug.WriteLine("Start: "+DateTime.Now.ToString());

                int result = firstClass.AddWithCallBack(100, 200);

                Debug.WriteLine("CallbackResult:" + result);

                Debug.WriteLine("End: "+DateTime.Now.ToString());

    检测输出结果:

    Start: 2011/5/17 16:14:38

    CallBack300

    CallBack: 2011/5/17 16:14:39

    CallbackResult:300

    End: 2011/5/17 16:14:39

     

    说明在调用开始一秒后,执行了回调操作。

    Over~!

     

     

  • 相关阅读:
    【题解】[HEOI2016/TJOI2016]字符串
    【题解】CF1037H Security
    Centos 7开机自启动oracle
    WRH$_ACTIVE_SESSION_HISTORY打补丁14084247实现自动分区
    oracle设置awr采集间隔和保留时间
    dgbroker配置Fast-Start Failover
    dgbroker删除后切换为手工管理
    删除dgbroker
    现有dgbroker管理的dg下添加一台从库且互相切换
    linux-unzip-error
  • 原文地址:https://www.cnblogs.com/xiaokang088/p/2049012.html
Copyright © 2011-2022 走看看