//建立异步回调
CComObject<COPCDataCallback>* pCOPCDataCallback;//回调对象的指针
CComObject<COPCDataCallback>::CreateInstance(&pCOPCDataCallback);//通过ATL模板创建回调对象的实例
当执行到这的时候报错,错误信息:OPCTest.exe 中的 0x012c2f79 处有未经处理的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突。
中断调试就跳到atlcom.h里的
CComObject(_In_opt_ void* = NULL) throw()
{
_pAtlModule->Lock();
}
了,有人遇到过这个问题吗?求指导
就这么多分了,实在不好意思

解决方案 »

  1.   

    CComModule _Module;
    _pAtlModule = &_Module; 
    CComObject<COPCDataCallback>* pCOPCDataCallback;//回调对象的指针
    CComObject<COPCDataCallback>::CreateInstance(&pCOPCDataCallback);//通过ATL模板创建回调对象的实例另: pCOPCDataCallback创建成功后的引用计数为零,使用时要增加引用计数AddRef,使用完再减少引用计数 Release。
      

  2.   

    空指针异常了,你Debug下看看你的指针是否为NULL了?
      

  3.   

    我加上这两句可以通过,但是最后释放资源的时候又跳到了
    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();
    执行完删除组,就会出现这个错误
      

  4.   

    Debug下打开call stack,看看函数调用堆栈,先找到出错的函数调用。
      

  5.   

    CComObject<COPCDataCallback>::CreateInstance(&pCOPCDataCallback);//通过ATL模板创建回调对象的实例
    上面这条语句是否正确不是很清楚,因为按照OPC它应该是建立一个回调对象
    我一般是这么写的
    COPCDataCallback* pCOPCDataCallback  = new CComObject<COPCDataCallback>;
    pCOPCDataCallback  ->AddRef();
    pCOPCDataCallback  ->FinalContruct();另外建议你一般来讲程序中不要调用CoUninitialize()因为系统会自己调用的,除非你准确知道本线程需要管理的COM对象已经完全释放了
      

  6.   

    call back不是这样用的。你需要用IConnectionPoint 下的Advise加上它,不能像对其它的com那样调用。
      

  7.   

    大神,我在建立回调后执行AtlAdvise时没成功,提示:找不到指定的对象导出程序。请问知道这是怎么回事吗?谢谢!很长时间了一直解决不了。
    代码如下:
    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);
      

  8.   

    用CComPtr<IOPCDataCallback>代替CComObject<COPCDataCallback>*