Com开发之回调
来源:互联网 发布:js正则表达式语法 编辑:程序博客网 时间:2024/05/16 12:29
本例讲述,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~!
- Com开发之回调
- C# COM组件开发之界面窗体
- 数据库开发之【企业级服务COM+事务】
- ArcGIS桌面开发之—COM模式
- COM/DCOM开发之进程内组件
- COM/DCOM开发之进程外组件
- COM 之 com 初谈
- 深入探索COM开发框架 之 MFC和ATL [一]
- 深入探索COM开发框架 之 MFC和ATL [二]
- 深入探索COM开发框架 之 MFC和ATL [三]
- 深入探索COM开发框架 之 MFC和ATL [四]
- COM/DCOM开发练习之进程内组件实例
- COM/DCOM开发练习之进程外组件实例
- COM/DCOM开发练习之远程进程外组件实例
- COM/DCOM开发练习之进程内组件实例
- COM/DCOM开发之远程进程外组件(DCOM)
- android开发笔记之com.android.support:percent
- apache module开发--c调com
- UVA 11300 Spreading the Wealth
- hql
- android API之ActivityGroup
- 读取文件到结构体
- BOJ 652
- Com开发之回调
- 软件架构设计之Utility模块——Functor
- 实验十三 SCVMM克隆和虚拟机模版
- A la Carte Pattern, Consulting Pattern Series
- windows下开发板的网络配置
- 为什么整合Spring与Struts2的时候,必须定义Struts2 Bean的Scope
- 利用libpcap库采集网口数据
- 设计模式六大原则(1):单一职责原则
- 最近写的一个makefile,可以配置编成elf,静态库,动态库