⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iopcdatacallback_imp.cpp

📁 DCOM 上位机和嵌入式系统通信
💻 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 + -