//建立异步回调
CComObject<COPCDataCallback>* pCOPCDataCallback;//回调对象的指针
CComObject<COPCDataCallback>::CreateInstance(&pCOPCDataCallback);//通过ATL模板创建回调对象的实例
当执行到这的时候报错,错误信息:OPCTest.exe 中的 0x012c2f79 处有未经处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突。
中断调试就跳到atlcom.h里的
CComObject(_In_opt_ void* = NULL) throw()
{
_pAtlModule->Lock();
}
了,有人遇到过这个问题吗?求指导
就这么多分了,实在不好意思
CComObject<COPCDataCallback>* pCOPCDataCallback;//回调对象的指针
CComObject<COPCDataCallback>::CreateInstance(&pCOPCDataCallback);//通过ATL模板创建回调对象的实例
当执行到这的时候报错,错误信息:OPCTest.exe 中的 0x012c2f79 处有未经处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突。
中断调试就跳到atlcom.h里的
CComObject(_In_opt_ void* = NULL) throw()
{
_pAtlModule->Lock();
}
了,有人遇到过这个问题吗?求指导
就这么多分了,实在不好意思
解决方案 »
- 同一个键复用,怎么解决
- 请教哪个会先启动?服务程序和自启动RUN键值下的程序。
- 东大的校友近来领分~~
- ADO连Oracle正常编译运行出错.
- 请高手指点:MDI程序中OnNewdocument()是在什么时候触发的?
- 如何将xml的树型结构体现在CTreeCtl控件中?急!再线!
- ###问一个菜问题,Server.CreateObject(***.***),这星星是什么,我们自己写控件时,要在程序中规定什么?
- 我有一个工程,怎么知到它是怎么生成的呢。
- 立体视觉
- 关于JavaScript和下拉框的问题
- 求一个C++下的WebSocket客户端例子
- 关于ug二次开发中出现的无法解析的外部符号,求助大神
_pAtlModule = &_Module;
CComObject<COPCDataCallback>* pCOPCDataCallback;//回调对象的指针
CComObject<COPCDataCallback>::CreateInstance(&pCOPCDataCallback);//通过ATL模板创建回调对象的实例另: pCOPCDataCallback创建成功后的引用计数为零,使用时要增加引用计数AddRef,使用完再减少引用计数 Release。
CComObject(_In_opt_ void* = NULL) throw()
{
_pAtlModule->Lock();
}
// Set refcount to -(LONG_MAX/2) to protect destruction and
// also catch mismatched Release in debug builds
virtual ~CComObject() throw()
{
m_dwRef = -(LONG_MAX/2);
FinalRelease();
#ifdef _ATL_DEBUG_INTERFACES
_AtlDebugInterfacesModule.DeleteNonAddRefThunk(_GetRawUnknown());
#endif
_pAtlModule->Unlock();
}
下面那个_pAtlModule->Unlock();了
我的释放资源代码:
HRESULT rl;
OPCHANDLE *phServer;
HRESULT *pErrors;
//删除Item
phServer=new OPCHANDLE[1];
phServer[0]=m_ItemResult[0].hServer;
rl=m_IOPCItemMgt->RemoveItems(1,//[in] 删除1个item
phServer,//[in] 服务器句柄
&pErrors);//[out]服务器返回的错误码
if (rl!=S_OK&&rl!=S_FALSE)
{
//RemoveItems失败
} else if (rl==S_OK)
{
//RemoveItems成功
}
delete[] phServer;
CoTaskMemFree(pErrors);
CoTaskMemFree(m_ItemResult);
m_ItemResult=NULL;
//释放异步接口
m_IOPCAsyncIO2->Release();
m_IOPCAsyncIO2=NULL;
//释放item管理接口
m_IOPCItemMgt->Release();
m_IOPCItemMgt=NULL;
//删除group对象
rl=m_IOPCServer->RemoveGroup(m_GrpSrvHandle,TRUE);
if (rl!=S_OK)
{
//RemoveGroup失败
}else{
//RemoveGroup成功
}
m_GrpSrvHandle=NULL;
rl=AtlUnadvise(m_IOPCGroupStateMgt,IID_IOPCDataCallback,m_dwAdvice);
m_IOPCGroupStateMgt->Release();
//释放OPC服务器
m_IOPCServer->Release();
m_IOPCServer=NULL;
//关闭COM库
CoUninitialize();
执行完删除组,就会出现这个错误
上面这条语句是否正确不是很清楚,因为按照OPC它应该是建立一个回调对象
我一般是这么写的
COPCDataCallback* pCOPCDataCallback = new CComObject<COPCDataCallback>;
pCOPCDataCallback ->AddRef();
pCOPCDataCallback ->FinalContruct();另外建议你一般来讲程序中不要调用CoUninitialize()因为系统会自己调用的,除非你准确知道本线程需要管理的COM对象已经完全释放了
代码如下:
CComModule _Module;
_pAtlModule = &_Module;
CComObject<COPCDataCallback> *pCOPCDataCallback;
CComObject<COPCDataCallback>::CreateInstance(&pCOPCDataCallback);
LPUNKNOWN pCbUnk;
pCbUnk = pCOPCDataCallback->GetUnknown();
DWORD dwCookie;
HRESULT hRes = AtlAdvise(pIOPCGroupStateMgt, pCbUnk, IID_IOPCDataCallback, &dwCookie);