//建立異步回呼
CComObject<COPCDataCallback>* pCOPCDataCallback;//回呼物件的指標
CComObject<COPCDataCallback>::CreateInstance(&pCOPCDataCallback);//通過ATL模板創建回呼物件的實體
當執行到這的時候報錯,錯誤資訊:OPCTest.exe 中的 0x012c2f79 處有未經處理的例外: 0xC0000005: 讀取位置 0x00000000 時發生訪問沖突。
中斷除錯就跳到atlcom.h里的
CComObject(_In_opt_ void* = NULL) throw()
{
_pAtlModule->Lock();
}
了,有人遇到過這個問題嗎?求指導
就這么多分了,實在不好意思
uj5u.com熱心網友回復:
CComModule _Module;
_pAtlModule = &_Module;
CComObject<COPCDataCallback>* pCOPCDataCallback;//回呼物件的指標
CComObject<COPCDataCallback>::CreateInstance(&pCOPCDataCallback);//通過ATL模板創建回呼物件的實體
另: pCOPCDataCallback創建成功后的參考計數為零,使用時要增加參考計數AddRef,使用完再減少參考計數 Release。
uj5u.com熱心網友回復:
空指標例外了,你Debug下看看你的指標是否為NULL了?uj5u.com熱心網友回復:
我加上這兩句可以通過,但是最后釋放資源的時候又跳到了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();
執行完洗掉組,就會出現這個錯誤
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
Debug下打開call stack,看看函式呼叫堆疊,先找到出錯的函式呼叫。uj5u.com熱心網友回復:
CComObject<COPCDataCallback>::CreateInstance(&pCOPCDataCallback);//通過ATL模板創建回呼物件的實體上面這條陳述句是否正確不是很清楚,因為按照OPC它應該是建立一個回呼物件
我一般是這么寫的
COPCDataCallback* pCOPCDataCallback = new CComObject<COPCDataCallback>;
pCOPCDataCallback ->AddRef();
pCOPCDataCallback ->FinalContruct();
另外建議你一般來講程式中不要呼叫CoUninitialize()因為系統會自己呼叫的,除非你準確知道本執行緒需要管理的COM物件已經完全釋放了
uj5u.com熱心網友回復:
call back不是這樣用的。你需要用IConnectionPoint 下的Advise加上它,不能像對其它的com那樣呼叫。uj5u.com熱心網友回復:
大神,我在建立回呼后執行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);
uj5u.com熱心網友回復:
用CComPtr<IOPCDataCallback>代替CComObject<COPCDataCallback>*轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/50102.html
