描述:
编程环境vc.net
实现功能:实现不带属性的服务端事件
客户调用atl,当atl完成工作时激发事件,客户响应它,调用响应的函数。
问题:第一次工作工程成功,第二次继续调用atl时失败,提示读取内存错误
我的实现方法:按照规则在服务端实现相应的代码(参考书:vc.net宝典)
部分代码为:void _stdcall UpData(void *p){
//更新数据线程,或实现其他的功能,这里省略,最后两句表示在更新完成激活事件
CDbObject *p = (CDbObject*)p;
pp->Fire_FinishUpData();//有wiz产生响应代码
}
STDMETHODIMP CDbject::DoSomething()//接口方法
{DWORD tID;
CreateThread (0,0,(LPTHREAD_START_ROUTINE)UpData,(void*)this,0,&tID);
return S_OK;
}
按照规则在客户端实现相应的部分代码(参考书:vc.net宝典)
void OnRun()//函数onrun调用atl
{
CoInitialize(NULL);
_Module.Init(NULL,GetModulehandle(NULL));//_Module 是CCOmModule类
try{
IDbObjectPtr p(CLSID_DbObject);
CEventHandler eh;//自定义类,从IDispEventImpl派生,并添加函数响应事件(函数仅蹦出一个对话框)
eh.DispEventAdvise(p);
p->DoSomething();
sleep(1000);//监视器工作一秒钟
eh.DispEventUnadvise(p);
}
catch(...)
{...}
_Module.Term();
CoUninitialize();
}