📄 iopcdatacallback_imp.cpp
字号:
#include "stdafx.h"
#include "iadvsink.h"
#include "iopcdatacallback_imp.h"
#include "iopcshutdown_imp.h"
#include "opc_user.h"
#include "CLIENT.h"
IOPCCallback_Imp:: IOPCCallback_Imp(CClientOPCGroup* pParent)
{
mRefCount = 0;
m_pGroup = pParent;
}
///////////////////////////////////////
//
///////////////////////////////////////
IOPCCallback_Imp:: ~IOPCCallback_Imp()
{
}
///////////////////////////////////////
//
///////////////////////////////////////
STDMETHODIMP_(ULONG) IOPCCallback_Imp:: AddRef( void)
{
return ++mRefCount;
}
///////////////////////////////////////
//
///////////////////////////////////////
STDMETHODIMP_(ULONG) IOPCCallback_Imp:: Release( void)
{
ULONG currentCount = --mRefCount;
// If no references left for this object
if ( currentCount == 0)
{
// Then delete this group.
delete this;
}
return currentCount;
}
///////////////////////////////////////
//
///////////////////////////////////////
STDMETHODIMP IOPCCallback_Imp:: QueryInterface( REFIID iid, LPVOID* ppInterface)
{
if ( ppInterface == NULL)
return E_INVALIDARG;
if ( iid == IID_IUnknown )
*ppInterface = (IUnknown*) this;
else if ( iid == IID_IOPCDataCallback)
{
*ppInterface = (IUnknown*) this;
}
else
{
*ppInterface = NULL;
}
if ( *ppInterface == NULL)
return E_NOINTERFACE;
AddRef();
return S_OK;
}
///////////////////////////////////////
//
///////////////////////////////////////
STDMETHODIMP IOPCCallback_Imp:: OnDataChange(
DWORD Transid,
OPCHANDLE grphandle,
HRESULT masterquality,
HRESULT mastererror,
DWORD count,
OPCHANDLE * clienthandles,
VARIANT * value,
WORD * quality,
FILETIME * time,
HRESULT * errors
)
{
DWORD i = 0;
CClientOPCItem * pItem;
BOOL bAsyncNotified = FALSE;
CString szTemp;
if (Transid != 0) // transaction = 0 --> not asynchrone
{
szTemp.Format(_T("-- Callback TransID=%04lu NbItemst=%04lu Fmt=DATATIME Result=%s\r\n"),Transid,count,CCrack::strOPCError(mastererror));
m_pGroup->m_szAsyncInfo += szTemp;
bAsyncNotified = TRUE;
if(Transid == m_pGroup->m_dwRefreshID) // it's a refresh
m_pGroup->m_AsyncState = OPC_ASYNC_CALLBACK; // we are in callback
// so, we cannot perform refresh !
}
for(i = 0; i < count; i ++)
{
pItem = m_pGroup->FindItemByKeyBis(clienthandles[i]);
if(pItem)
{
pItem->SetItemData( NULL,&time[i],&quality[i],&value[i]);
if ((errors[i] != S_OK) && (bAsyncNotified == TRUE)){
szTemp.Format(" Item : %s\r\n",CCrack::strFromWCHAR(pItem->m_szItemID));
m_pGroup->m_szAsyncInfo += szTemp;
}
}
}
if(Transid == m_pGroup->m_dwRefreshID) // If it is a refresh ...
{
m_pGroup->m_AsyncState = OPC_ASYNC_SUPPORTED; // now, we can perform refresh
m_pGroup->m_dwRefreshID = 0;
}
// To refresh list view
::PostMessage(AfxGetMainWnd()->m_hWnd, WM_OPCCLIENTNOTIFIED, 0, (LPARAM)m_pGroup);
if(bAsyncNotified) // If it is asynchrone, refresh the asynchrone message display view
::PostMessage(AfxGetMainWnd()->m_hWnd, WM_OPCCLIENTNOTIFIED_ASYNC, 0, (LPARAM)m_pGroup);
return S_OK;
}
///////////////////////////////////////
//
///////////////////////////////////////
STDMETHODIMP IOPCCallback_Imp:: OnReadComplete(
DWORD Transid,
OPCHANDLE grphandle,
HRESULT masterquality,
HRESULT mastererror,
DWORD count,
OPCHANDLE * clienthandles,
VARIANT * value,
WORD * quality,
FILETIME * time,
HRESULT * errors
)
{
DWORD i = 0;
CClientOPCItem * pItem;
BOOL bAsyncNotified = FALSE;
CString szTemp;
if (Transid != 0) // transaction = 0 --> not asynchrone
{
szTemp.Format(_T("-- Callback TransID=%04lu NbItemst=%04lu Fmt=DATATIME Result=%s\r\n"),Transid,count,CCrack::strOPCError(mastererror));
m_pGroup->m_szAsyncInfo += szTemp;
bAsyncNotified = TRUE;
if(Transid == m_pGroup->m_dwRefreshID) // it's a refresh
m_pGroup->m_AsyncState = OPC_ASYNC_CALLBACK; // we are in callback
// so, we cannot perform refresh !
}
for(i = 0; i < count; i ++)
{
pItem = m_pGroup->FindItemByKeyBis(clienthandles[i]);
if(pItem)
{
pItem->SetItemData( NULL,&time[i],&quality[i],&value[i]);
if ((errors[i] != S_OK) && (bAsyncNotified == TRUE)){
szTemp.Format(" Bad Item : %s\r\n",CCrack::strFromWCHAR(pItem->m_szItemID));
m_pGroup->m_szAsyncInfo += szTemp;
}
}
}
if(Transid == m_pGroup->m_dwRefreshID) // If it is a refresh ...
{
m_pGroup->m_AsyncState = OPC_ASYNC_SUPPORTED; // now, we can perform refresh
m_pGroup->m_dwRefreshID = 0;
}
// To refresh list view
::PostMessage(AfxGetMainWnd()->m_hWnd, WM_OPCCLIENTNOTIFIED, 0, (LPARAM)m_pGroup);
if(bAsyncNotified) // If it is asynchrone, refresh the asynchrone message display view
::PostMessage(AfxGetMainWnd()->m_hWnd, WM_OPCCLIENTNOTIFIED_ASYNC, 0, (LPARAM)m_pGroup);
return S_OK;
}
///////////////////////////////////////
//
///////////////////////////////////////
STDMETHODIMP IOPCCallback_Imp:: OnWriteComplete(
DWORD Transid,
OPCHANDLE grphandle,
HRESULT mastererr,
DWORD count,
OPCHANDLE * clienthandles,
HRESULT * error
)
{
BOOL bAsyncNotified = FALSE;
CString szTemp;
if (Transid != 0) // transaction = 0 --> not asynchrone
{
szTemp.Format(_T("-- Callback TransID=%04lu NbItemst=%04lu Result=%s\r\n"),Transid,count,CCrack::strOPCError(mastererr));
m_pGroup->m_szAsyncInfo += szTemp;
bAsyncNotified = TRUE;
}
for(DWORD i = 0; i < count; i ++)
{
CClientOPCItem* pItem = m_pGroup->FindItemByKeyBis(clienthandles[i]);
if(pItem)
{
if ((error[i] != S_OK) && (bAsyncNotified == TRUE)){
szTemp.Format(" Bad Item : %s\r\n",CCrack::strFromWCHAR(pItem->m_szItemID));
m_pGroup->m_szAsyncInfo += szTemp;
}
}
}
// To refresh list view
::PostMessage(AfxGetMainWnd()->m_hWnd, WM_OPCCLIENTNOTIFIED, 0, (LPARAM)m_pGroup);
if(bAsyncNotified) // If it is asynchrone, refresh the asynchrone message display view
::PostMessage(AfxGetMainWnd()->m_hWnd, WM_OPCCLIENTNOTIFIED_ASYNC, 0, (LPARAM)m_pGroup);
return S_OK;
}
///////////////////////////////////////
//
///////////////////////////////////////
STDMETHODIMP IOPCCallback_Imp:: OnCancelComplete(
DWORD transid,
OPCHANDLE grphandle
)
{
CString szTemp;
BOOL bAsyncNotified = FALSE;
if (transid != 0) // transaction = 0 --> not asynchrone
{
szTemp.Format(_T("-- Callback TransID=%04lu CancelComplete"),transid);
m_pGroup->m_szAsyncInfo += szTemp;
bAsyncNotified = TRUE;
}
m_pGroup->m_AsyncState = OPC_ASYNC_SUPPORTED; // now, we can perform refresh
// To refresh list view
::PostMessage(AfxGetMainWnd()->m_hWnd, WM_OPCCLIENTNOTIFIED, 0, (LPARAM)m_pGroup);
if(bAsyncNotified) // If it is asynchrone, refresh the asynchrone message display view
::PostMessage(AfxGetMainWnd()->m_hWnd, WM_OPCCLIENTNOTIFIED_ASYNC, 0, (LPARAM)m_pGroup);
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -