亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? impiopcasyncio.cpp

?? 基于Intellution開發包的開發的OPC服務器
?? CPP
字號:
// ImIOPCAsyncIO.cpp
//
//  This file contains the implementation of 
//  the IOPCASyncIO interface for groups in the OPC server.
//
//	(c) COPYRIGHT 1996-1998, INTELLUTION INC.
// ALL RIGHTS RESERVED
//
//
//	Functions defined in this module:
//
//			CImpIOPCAsyncIO::CImpIOPCAsyncIO()
//			CImpIOPCAsyncIO::~CImpIOPCAsyncIO()
//			CImpIOPCAsyncIO::AddRef()
//			CImpIOPCAsyncIO::Release()
//			CImpIOPCAsyncIO::QueryInterface()
//			CImpIOPCAsyncIO::Read()
//			CImpIOPCAsyncIO::Write()
//			CImpIOPCAsyncIO::Refresh()
//			CImpIOPCAsyncIO::Cancel()
//
//
//
// Modification Log:
//	Vers	Date     By		Notes
//	----	-------- ---	-----
//	1.00	08/26/97 jra	Created
//	1.3		03/10/98 jra	Modified to be wizard generated and driver specific.
//
//

#include "OpcStdAfx.h"

#include "OPC.h"
#include "OPCError.h"

#define WIN32_LEAN_AND_MEAN


/////////////////////////////////////////////////////////////////////////////
// Constructor /Destructor functions
//

////////////////////////////////////////////////////////////////
// CImpIOPCAsyncIO()
//   Constructor for this Interface
//
////////////////////////////////////////////////////////////////
CImpIOPCAsyncIO::CImpIOPCAsyncIO(LPUNKNOWN pUnkOuter)
{
	m_pUnkOuter = pUnkOuter;
	m_pParentGroup = (COPCDrvGroup *)pUnkOuter;
}


////////////////////////////////////////////////////////////////
// ~CImpIOPCAsyncIO()
//   Destructor for this Interface
//
////////////////////////////////////////////////////////////////
CImpIOPCAsyncIO::~CImpIOPCAsyncIO( void)
{
	m_pParentGroup->m_pCImpIAsyncIO = NULL;
}


/////////////////////////////////////////////////////////////////////////////
// IUnknown functions Delegate to Parent
//

////////////////////////////////////////////////////////////////
// AddRef()
//
////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) CImpIOPCAsyncIO::AddRef(void)
{
	return m_pUnkOuter->AddRef();
}


////////////////////////////////////////////////////////////////
// Release()
//
////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) CImpIOPCAsyncIO::Release(void)
{
	return m_pUnkOuter->Release();
}


////////////////////////////////////////////////////////////////
// QueryInterface()
//
////////////////////////////////////////////////////////////////
STDMETHODIMP CImpIOPCAsyncIO::QueryInterface(REFIID		iid, 
											 LPVOID		*ppInterface)
{
	return m_pUnkOuter->QueryInterface(iid, ppInterface);
}


/////////////////////////////////////////////////////////////////////////////
// CImpIOPCAsyncIO (IOPCAsyncIO) interface functions
//


////////////////////////////////////////////////////////////////
// Read()
//
// Queue up an Async read.
// 
////////////////////////////////////////////////////////////////
STDMETHODIMP CImpIOPCAsyncIO::Read(DWORD			dwConnection, 
								   OPCDATASOURCE	dwSource,
								   DWORD			dwNumItems, 
								   OPCHANDLE		*phServer,
								   DWORD			*pTransactionID, 
								   HRESULT			**ppErrors)
{
	COPCDrvServer		*pParentServer	= m_pParentGroup->m_pParentServer;
	BOOL				bReject			= FALSE;
	HRESULT				*phResults		= NULL;
	COPCDrvAsyncTrans	*pTransaction	= NULL;


	// Make sure that we didn't get any bad pointers
	//
	if ((0 == dwNumItems) || (NULL == phServer) || (NULL == pTransactionID) ||
		(NULL == ppErrors))
	{
		return E_INVALIDARG;
	}

	// Make sure the client has registered for async callbacks
	//
	if ((!m_pParentGroup->m_pCImpIDataObject->IsAdvisedForDataTime()) && 
		(!m_pParentGroup->m_pCImpIDataObject->IsAdvisedForData()))
	{
		*pTransactionID = NULL;
		*ppErrors		= NULL;
		return CONNECT_E_NOCONNECTION;
	}

	// Initialize OUT parameters to NULL
	//
	*pTransactionID	= NULL;
	*ppErrors		= NULL;

	// Alloc memory for returned error list
	// and the stored handle list (to be returned later in the callback)
	//
	phResults = *ppErrors = (HRESULT *)pIMalloc->Alloc(dwNumItems * sizeof(HRESULT));
	if(NULL == phResults)
	{
		return E_OUTOFMEMORY;
	}

	// Lock the parent group so no one else removes or adds any items
	//
	m_pParentGroup->Lock();

	// First, validate ALL of the handles
	//
	for (DWORD j = 0; j < dwNumItems; j++)
	{
		if (!m_pParentGroup->IsItemValid(phServer[j]))
		{
			phResults[j] = OPC_E_INVALIDHANDLE;
			bReject = TRUE;
			continue;
		}

		phResults[j] = S_OK;
	}

	// If any handles are bad then we are finished
	//
	if (bReject)
	{
		m_pParentGroup->UnLock();
		return OPC_E_INVALIDHANDLE;
	}

	// If all handles are good, create and initialize a new transaction
	//
	pTransaction = new COPCDrvAsyncTrans(m_pParentGroup);
	if (NULL == pTransaction)
	{
		pIMalloc->Free(phResults);
		m_pParentGroup->UnLock();
		return E_OUTOFMEMORY;
	}

	if (FAILED(pTransaction->Init(TRANS_READ, dwSource, dwNumItems, phServer)))
	{
		pIMalloc->Free(phResults);
		delete pTransaction;
		m_pParentGroup->UnLock();
		return E_FAIL;
	}

	// Get the transaction ID for the caller and add the read to the queue
	//
	*pTransactionID = pTransaction->GetTransactionID();
	pTransaction->AddToQueue();

	// Unlock the parent group object
	//
	m_pParentGroup->UnLock();

	return S_OK;
}


////////////////////////////////////////////////////////////////
// Write()
//
// Queue up an Async Write.
//
////////////////////////////////////////////////////////////////
STDMETHODIMP CImpIOPCAsyncIO::Write(DWORD			dwConnection, 
									DWORD			dwNumItems, 
									OPCHANDLE		*phServer, 
									VARIANT			*pItemValues, 
									DWORD			*pTransactionID, 
									HRESULT			**ppErrors)
{
	COPCDrvServer		*pParentServer	= m_pParentGroup->m_pParentServer;
	unsigned int		j;
	BOOL				bReject			= FALSE;
	HRESULT				*phResults		= NULL;
	COPCDrvAsyncTrans	*pTransaction	= NULL;


	// Sanity Checks
	//
	if ((0 == dwNumItems) || (NULL == phServer) || (NULL == pTransactionID) ||
		(NULL == pItemValues) || (NULL == ppErrors))
	{
		return E_INVALIDARG;
	}

	// Make sure the client has registered for async callbacks
	//
	if (!m_pParentGroup->m_pCImpIDataObject->IsAdvisedForWriteComplete())
	{
		*pTransactionID = NULL;
		*ppErrors		= NULL;
		return CONNECT_E_NOCONNECTION;
	}

	// Make sure the client has registered for async callbacks
	//
	if (!m_pParentGroup->m_pCImpIDataObject->IsAdvisedForWriteComplete())
	{
		*pTransactionID = NULL;
		*ppErrors		= NULL;
		return CONNECT_E_NOCONNECTION;
	}

	// Initialize OUT parameters to NULL
	//
	*pTransactionID	= NULL;
	*ppErrors		= NULL;

	// Alloc memory for returned error list
	// and the stored handle list (to be returned later in the callback)
	//
	phResults = *ppErrors = (HRESULT *)pIMalloc->Alloc(dwNumItems * sizeof(HRESULT));
	if(NULL == phResults)
	{
		return E_OUTOFMEMORY;
	}

	// Lock the parent group so no one else removes or adds any items
	//
	m_pParentGroup->Lock();

	// First, validate ALL of the handles
	//
	for (j = 0; j < dwNumItems; j++)
	{
		if (!m_pParentGroup->IsItemValid(phServer[j]))
		{
			phResults[j] = OPC_E_INVALIDHANDLE;
			bReject = TRUE;
			continue;
		}

		phResults[j] = S_OK;
	}

	// If any handles are bad then we are finished
	//
	if (bReject)
	{
		m_pParentGroup->UnLock();
		return OPC_E_INVALIDHANDLE;
	}

	// If all handles are good, create and initialize a new transaction
	//
	pTransaction = new COPCDrvAsyncTrans(m_pParentGroup);
	if (NULL == pTransaction)
	{
		pIMalloc->Free(phResults);
		m_pParentGroup->UnLock();
		return E_OUTOFMEMORY;
	}

	if (FAILED(pTransaction->Init(TRANS_WRITE, OPC_DS_CACHE, dwNumItems, phServer, pItemValues)))
	{
		pIMalloc->Free(phResults);
		delete pTransaction;
		m_pParentGroup->UnLock();
		return E_FAIL;
	}

	// Get the transaction ID for the caller and add the write to the queue
	//
	*pTransactionID = pTransaction->GetTransactionID();
	pTransaction->AddToQueue();

	m_pParentGroup->UnLock();

	return S_OK;
}


////////////////////////////////////////////////////////////////
// Refresh()
//
// Queue up an Async refresh 
// (which is a cross between async read and OnDataChange).
//
////////////////////////////////////////////////////////////////
STDMETHODIMP CImpIOPCAsyncIO::Refresh(DWORD				dwConnection, 
									  OPCDATASOURCE		dwSource,
									  DWORD				*pTransactionID)
{
	COPCDrvItem		*pItem;
	POSITION		posItem;
	OPCHANDLE		OPCHandle;
	int				nNumActiveItems	= 0;
	DWORD			dwNumItems		= 0;
	OPCHANDLE		*pHandleList	= NULL;
	HRESULT			hr,
					*pErrors		= NULL;


	// Make sure the client has registered for async callbacks
	//
	if ((!m_pParentGroup->m_pCImpIDataObject->IsAdvisedForDataTime()) && 
		(!m_pParentGroup->m_pCImpIDataObject->IsAdvisedForData()))
	{
		*pTransactionID = NULL;
		return CONNECT_E_NOCONNECTION;
	}

	// Initialize OUT parameters to NULL
	//
	*pTransactionID = NULL;

	// Lock the parent group so nothing changes
	//
	m_pParentGroup->Lock();

	posItem		= m_pParentGroup->GetFirstItemPosition();
	dwNumItems	= m_pParentGroup->GetNumItemHandles();

	// Allocate the memory for the handle list
	//
	pHandleList = new OPCHANDLE [dwNumItems];
	if(NULL == pHandleList) 
	{
		m_pParentGroup->UnLock();
		return E_OUTOFMEMORY;
	}

	// Count active items in group
	//
	if (m_pParentGroup->m_bActive)
	{
		for (DWORD j = 0; j < dwNumItems; j++)
		{
			m_pParentGroup->GetNextItem(posItem, OPCHandle, pItem);

			// If item is in use
			//
			if (pItem->m_bActive)
			{
				pHandleList[j] = OPCHandle;
				nNumActiveItems++;
			}
		}
	}

	m_pParentGroup->UnLock();

	// If nothing active, return FAIL (per spec)
	//
	if (0 == nNumActiveItems)
	{
		delete [] pHandleList;
		return E_FAIL;
	}

	// We are just going to do a read for all active items in the list
	//
	hr = Read(dwConnection, 
			  dwSource,
			  dwNumItems, 
			  pHandleList,
			  pTransactionID,
			  &pErrors);

	// Free the error list because we don't need it
	//
	if (pErrors)
	{
		CoTaskMemFree(pErrors);
	}
	if (pHandleList)
	{
		delete [] pHandleList;
	}

	if (FAILED(hr))
	{
		return E_FAIL;
	}
	return S_OK;
}


////////////////////////////////////////////////////////////////
// Cancel()
//
// This function cancels a pending asynch transaction.
//
////////////////////////////////////////////////////////////////
STDMETHODIMP CImpIOPCAsyncIO::Cancel(DWORD		dwTransactionID)
{
	COPCDrvAsyncTrans	*pTrans		= NULL;
	POSITION			posTrans	= NULL;
	HRESULT				hr			= E_FAIL;


	// Lock the parent group because the asynch transaction may
	// already be in progress.
	//
	m_pParentGroup->Lock();

	// search for this transaction in the queues
	//
	if(m_pParentGroup->m_AsyncReadQueue.GetCount() > 0)
	{
		posTrans = m_pParentGroup->m_AsyncReadQueue.GetHeadPosition();
		while (posTrans)
		{
			pTrans = (COPCDrvAsyncTrans *)m_pParentGroup->m_AsyncReadQueue.GetNext(posTrans);
			if (pTrans->GetTransactionID() == dwTransactionID)
			{
				pTrans->Cancel();
				hr = S_OK;
				break;
			}
		}
	}
	if ((m_pParentGroup->m_AsyncWriteQueue.GetCount() > 0) && (S_OK != hr))
	{
		posTrans = m_pParentGroup->m_AsyncWriteQueue.GetHeadPosition();
		while (posTrans)
		{
			pTrans = (COPCDrvAsyncTrans *)m_pParentGroup->m_AsyncWriteQueue.GetNext(posTrans);
			if (pTrans->GetTransactionID() == dwTransactionID)
			{
				pTrans->Cancel();
				hr = S_OK;
				break;
			}
		}
	}

	// Unlock the parent group.
	//
	m_pParentGroup->UnLock();
	return hr;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久影视一区二区| 欧美日韩中文字幕一区二区| 午夜在线电影亚洲一区| 日本不卡一区二区三区| 一级特黄大欧美久久久| 亚洲制服欧美中文字幕中文字幕| 亚洲欧美日本韩国| 亚洲成人第一页| 久久精品国产77777蜜臀| 久草中文综合在线| 高清av一区二区| 成人午夜免费视频| 色天使色偷偷av一区二区| 色国产综合视频| 欧美人动与zoxxxx乱| 欧美大片顶级少妇| 国产日本欧美一区二区| 国产精品第五页| 亚洲国产精品一区二区久久恐怖片| 亚洲电影第三页| 韩国一区二区视频| hitomi一区二区三区精品| 欧美性色aⅴ视频一区日韩精品| 777久久久精品| 国产亚洲精品资源在线26u| 亚洲图片欧美激情| 丝袜美腿亚洲综合| 成人污污视频在线观看| 欧美日韩一区久久| 国产日韩欧美不卡| 亚洲午夜视频在线| 国产精品1区二区.| 欧美亚洲高清一区| 久久精品人人爽人人爽| 一区二区三区视频在线看| 精品一区二区免费看| 99精品黄色片免费大全| 欧美成人video| 亚洲欧美激情小说另类| 精品一区中文字幕| 色94色欧美sute亚洲线路二| 久久久久久久久久久久电影| 午夜久久久久久| av中文字幕不卡| 日韩精品在线一区| 亚洲成av人片www| 99久久精品情趣| 精品欧美乱码久久久久久| 一个色妞综合视频在线观看| 国产福利一区在线观看| 91麻豆精品久久久久蜜臀| 亚洲欧洲另类国产综合| 国产一区二区三区| 91精品国产色综合久久久蜜香臀| 欧美激情中文字幕一区二区| 另类专区欧美蜜桃臀第一页| 欧美精品久久久久久久久老牛影院| 日本一区二区三区免费乱视频| 日韩不卡一二三区| 制服丝袜亚洲精品中文字幕| 洋洋成人永久网站入口| 色综合久久中文字幕综合网| 国产精品视频在线看| 丁香婷婷综合色啪| 国产欧美一区二区精品性色| 久久99精品一区二区三区三区| 欧美一区二区在线观看| 亚洲一区二区三区激情| 日本高清不卡视频| 亚洲一区二区av在线| 色婷婷亚洲婷婷| 亚洲精品欧美综合四区| 91丨九色丨尤物| 亚洲激情一二三区| 91美女在线看| 亚州成人在线电影| 91精品国产一区二区三区香蕉| 午夜私人影院久久久久| 制服丝袜在线91| 久久91精品久久久久久秒播| 久久久久久久久久久久久久久99| 国产福利一区二区| 国产精品久久久久久久岛一牛影视| 成人午夜av电影| 玉足女爽爽91| 欧美日韩国产影片| 捆绑调教一区二区三区| 久久日韩精品一区二区五区| 国产精品伊人色| 综合中文字幕亚洲| 精品视频在线免费看| 毛片一区二区三区| 国产精品久久一卡二卡| 在线观看一区不卡| 久久99精品视频| 国产精品第一页第二页第三页| 在线精品视频小说1| 久久电影国产免费久久电影 | 久久网站最新地址| 99久久久无码国产精品| 亚洲成人精品影院| 久久久久久亚洲综合| 一本到三区不卡视频| 免费精品视频最新在线| 国产精品精品国产色婷婷| 欧美探花视频资源| 国产精品1区2区3区| 依依成人精品视频| 欧美成va人片在线观看| 色哟哟亚洲精品| 精品一区二区久久久| 一区二区成人在线| 久久看人人爽人人| 欧美日韩国产天堂| 粉嫩一区二区三区在线看 | 精品国内二区三区| 99re这里只有精品视频首页| 久久99精品久久久久久动态图 | 26uuu精品一区二区在线观看| av网站免费线看精品| 久久99久久精品| 午夜欧美一区二区三区在线播放| 国产天堂亚洲国产碰碰| 91精品国产91久久久久久最新毛片| 成人美女视频在线观看18| 免费不卡在线视频| 亚洲国产精品久久久男人的天堂| 亚洲国产成人私人影院tom| 337p亚洲精品色噜噜狠狠| 91在线观看下载| 国产99久久久国产精品潘金| 男女激情视频一区| 视频在线观看一区| 亚洲午夜精品一区二区三区他趣| 国产精品二三区| 久久精品在这里| 久久无码av三级| 精品久久久久久综合日本欧美| 欧美高清hd18日本| 欧美亚洲动漫精品| 欧美亚洲免费在线一区| 色综合一区二区| 99re热这里只有精品免费视频| 国产一区不卡视频| 久久99精品久久久久婷婷| 蜜桃视频一区二区三区在线观看| 五月婷婷综合在线| 日精品一区二区三区| 午夜婷婷国产麻豆精品| 性做久久久久久久久| 亚洲福利视频三区| 午夜精品在线看| 蜜桃精品视频在线| 国产一区二区视频在线播放| 久久99国产精品免费| 国产精品资源网站| 丰满岳乱妇一区二区三区| 成人妖精视频yjsp地址| caoporn国产一区二区| 99re6这里只有精品视频在线观看 99re8在线精品视频免费播放 | 国产一区美女在线| 国产精品一二三四| av中文字幕亚洲| 欧美午夜宅男影院| 91精品黄色片免费大全| 欧美精品一区二区三区蜜桃| 久久日一线二线三线suv| 国产精品午夜在线| 亚洲黄色av一区| 日日骚欧美日韩| 国产在线播放一区二区三区| 懂色av中文一区二区三区| 91久久久免费一区二区| 欧美日本国产一区| 久久婷婷综合激情| 亚洲乱码国产乱码精品精小说| 亚洲国产一区二区视频| 免费成人小视频| 波多野结衣在线aⅴ中文字幕不卡| 色综合久久精品| 精品国产免费人成电影在线观看四季| 久久久久久久性| 亚洲国产wwwccc36天堂| 国产在线不卡一区| 欧美伊人久久久久久久久影院| 欧美不卡激情三级在线观看| 国产精品不卡在线| 日本人妖一区二区| 99精品在线观看视频| 日韩精品一区二区三区老鸭窝| 日本一区二区视频在线| 日日摸夜夜添夜夜添亚洲女人| 国产999精品久久| 日韩一级大片在线| 亚洲精品乱码久久久久久 | 91欧美激情一区二区三区成人| 91精品国产色综合久久不卡蜜臀| 亚洲欧洲日产国产综合网| 久久www免费人成看片高清| 欧美在线制服丝袜|