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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? opcdrvserver.cpp

?? 基于Intellution開發(fā)包的開發(fā)的OPC服務(wù)器
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// OPCDrvServer.cpp
//
//  This file contains the implementation of the Server object.
//
// This implementation uses 'tear off' interfaces
// (I.e. the interfaces are separate from the object 
//  which supports only IUnknown)
//
//
//	(c) COPYRIGHT 1996-1998, INTELLUTION INC.
// ALL RIGHTS RESERVED
//
//
//	Functions defined in this module:
//
//			COPCDrvServer::COPCDrvServer()
//			COPCDrvServer::~COPCDrvServer()
//			COPCDrvServer::AddRef()
//			COPCDrvServer::Release()
//			COPCDrvServer::QueryInterface()
//			COPCDrvServer::Init()
//			COPCDrvServer::GetNameList()
//			COPCDrvServer::FreeNameList()
//			COPCDrvServer::GetUnkList()
//			COPCDrvServer::FreeUnkList()
//			COPCDrvServer::UpdateDataCache()
//			COPCDrvServer::GetDriverInfo()
//			COPCDrvServer::IsDataTypeSupported()
//			COPCDrvServer::SendMessageToDriver()
//			COPCDrvServer::PollThread()
//
//
//
// Modification Log:
//	Vers	Date     By		Notes
//	----	-------- ---	-----
//	1.0		08/26/97 jra	Created
//	1.3		03/10/98 jra	Modified to be wizard generated and driver specific.
//
//

#define WIN32_LEAN_AND_MEAN

#include "OpcStdAfx.h"
#include <AFXCONV.h>
#include <process.h>

#include "OPCDrv.h"
#include "OPCDrvThread.h"
#include "..\server\interfaces\InterfaceDef_i.c"
// added support for OSDKPS.dll
#include <OSDKDefs_i.c>
#include "NioFuncs.h"

extern BOOL		ChangeDriverThreadPriority(DWORD dwPriority);
extern DWORD	g_dwWaitPeriod;
extern DWORD	g_dwServerThreadPriority;
extern TCHAR	g_tszAcronym[];
extern FILETIME	g_ftStartTime;


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

////////////////////////////////////////////////////////////////
// COPCDrvServer()
//
// Constructor for the main server object
//
////////////////////////////////////////////////////////////////
COPCDrvServer::COPCDrvServer(LPUNKNOWN	pOuter, 
							 void		(*pfn)(void))
{
	// Init reference count to 0
	//
	m_lRefCount					= 0;

	// Clear out 'tear-off' interface ptrs
	// The interfaces will be created as needed in QueryInterface
	//
	m_pCImpIOPCServer			= NULL;
	m_pCImpIOPCBrowseServer		= NULL;
	m_pCImpIPersistFile			= NULL;

	m_dwBandwidth				= 0;
	m_ServerState				= OPC_STATUS_NOCONFIG;

	// Used to calculate bandwidth
	//
	m_dwNumGroupsProcessed		= 0;
	m_dwTotalPasses				= 0;
	m_bKeepRunning				= TRUE;

	m_dwLastTickCount			= 0;

	// Get current UTC Time and store it
	//
	CoFileTimeNow(&m_ftLastUpdate);
	m_ftServerStartTime = g_ftStartTime;

	m_pfnDestroy				= pfn;
	m_lTransactionID			= 0;
	m_Slot						= 0;
	m_dwPollThreadId			= 0L;

	// Management of the groups
	//
	m_dwNumGroups				= 0;

	// Initialize the Group hash table to a prime number
	//
	m_mapGroup.InitHashTable(31);

	InitializeCriticalSection(&this->m_Lock);

	// Hardware options stuff
	//
	m_nOptionsSize				= 0;
	m_nNumOptions				= 0;
	m_pszOptions				= NULL;
	m_pvtOptionValues			= NULL;

	// I/O Server interface stuff
	//
	m_pIDriver					= NULL;
	m_pIDriverMessage			= NULL;
	m_pIDriverMessageMarshalled	= NULL;
	m_pIOpcConnections			= NULL;
	m_pIDriverMessageStream		= NULL;
}


////////////////////////////////////////////////////////////////
// ~COPCDrvServer()
//
// Destructor for the main server object
//
////////////////////////////////////////////////////////////////
COPCDrvServer::~COPCDrvServer(void)
{
	// Shutdown the bandwidth thread
	//
	m_bKeepRunning = FALSE;

	// First, turn off any background processing
	//
	ClearServerSlot(m_Slot);

	// Wait for the threads to shutdown.
	//
	if (WaitForSingleObject(m_hPollThread, 
							THREAD_SHUTDOWN_TIME) == WAIT_TIMEOUT)
	{
		TerminateThread(m_hPollThread, 0);
	}

	// Lock out this server
	//
	Lock();

	// If necessary free any memory associated with the Group map
	//
	FreeAllGroups();

	// Then delete any tear off interfaces
	//
	if (m_pCImpIOPCServer)
	{
		delete m_pCImpIOPCServer;
	}
	if (m_pCImpIPersistFile)
	{
		delete m_pCImpIPersistFile;
	}
	if (m_pCImpIOPCBrowseServer)
	{
		delete m_pCImpIOPCBrowseServer;
	}

	// Delete the hardware options lists
	//
	if (m_pszOptions)
	{
		delete [] m_pszOptions;
	}
	if (m_pvtOptionValues)
	{
		delete [] m_pvtOptionValues;
	}

	// Inform NIO that we are unloading if this is the last one
	//
	if (0 == GetServerSlotCount())
	{
		IOSTAT	IoStat;

		memset(&IoStat, 0, sizeof(IOSTAT));
		nio_CleanUp(&IoStat);
		if (IoStat.iostatus != FE_OK)
		{
			HRESULT hr = (HRESULT)((IoStat.aux1 << 16) | IoStat.aux2);
			CString szMsg;

			szMsg.Format("nio_CleanUp() failed. Returned code = %lX", hr);
			SendMessageToDriver(szMsg, MSG_DEBUG);
		}
	}

	// Disconnect from the automation interface
	//
	if (m_pIDriverMessage)
	{
		m_pIDriverMessage->Release();
	}
	if (m_pIOpcConnections)
	{
		long lRef = 0L;
		m_pIOpcConnections->GetOpcRef(&lRef);
		m_pIOpcConnections->Release();
	}
	if (m_pIDriver)
	{
		m_pIDriver->Release();
	}

	UnLock();
	DeleteCriticalSection(&this->m_Lock);
}


/////////////////////////////////////////////////////////////////////////////
// IUnknown functions
//

////////////////////////////////////////////////////////////////
// IUnknown::AddRef()
//
// Standard IUnknown implementation
//
////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) COPCDrvServer::AddRef(void)
{
	return InterlockedIncrement(&m_lRefCount);
}


////////////////////////////////////////////////////////////////
// IUnknown::Release()
//   Standard IUnknown implementation
//
////////////////////////////////////////////////////////////////
STDMETHODIMP_(ULONG) COPCDrvServer::Release(void)
{
	ASSERT(0 != m_lRefCount);

	ULONG currentCount = InterlockedDecrement(&m_lRefCount);

	// If no references left for this server
	if (currentCount == 0)
	{
		// Then delete this server.
		//
		if(m_pfnDestroy) 
		{
			(*m_pfnDestroy)();	// DLL can unload if last one
		}

		delete this;
	}

	return currentCount;
}


////////////////////////////////////////////////////////////////
// IUnknown::QueryInterface()
//
// Standard IUnknown implementation using 'tear off' interfaces
//
////////////////////////////////////////////////////////////////
STDMETHODIMP COPCDrvServer::QueryInterface(REFIID	iid, 
										   LPVOID	*ppInterface)
{
	// Make sure we got a valid pointer
	//
	if (NULL == ppInterface)
	{
		return E_INVALIDARG;
	}	

	// IUnknown
	if (iid == IID_IUnknown)
	{
		*ppInterface = (IUnknown *)this;
	}
	// IOPCServer
	else if (iid == IID_IOPCServer)
	{
		if(NULL == m_pCImpIOPCServer) 
		{
			m_pCImpIOPCServer = new CImpIOPCServer(this);
		}
		if (NULL == m_pCImpIOPCServer)
		{
			return E_OUTOFMEMORY;
		}
		*ppInterface = m_pCImpIOPCServer;
	}
	// IOPCBrowseServerAddressSpace
	else if (iid == IID_IOPCBrowseServerAddressSpace)
	{
		if(NULL == m_pCImpIOPCBrowseServer)
		{
			m_pCImpIOPCBrowseServer = new CImpIOPCBrowseServer(this);
		}
		if (NULL == m_pCImpIOPCBrowseServer)
		{
			return E_OUTOFMEMORY;
		}
		*ppInterface = m_pCImpIOPCBrowseServer;
	}
	// IPersistFile
	else if ((iid == IID_IPersistFile) || (iid == IID_IPersist))
	{
		if(NULL == m_pCImpIPersistFile) 
		{
			m_pCImpIPersistFile = new CImpIPersistFile(this);
		}
		if (NULL == m_pCImpIPersistFile)
		{
			return E_OUTOFMEMORY;
		}
		*ppInterface = m_pCImpIPersistFile;
	}
	// IEnumUnknown
	else if (iid == IID_IEnumUnknown)
	{
		// Note enumerators are special in that they are independent objects
		// They are not just interfaces on an existing object
		//
		HRESULT				hr;
		CImpIEnumUnknown	*temp;
		LPUNKNOWN			*GroupList;
		int					nGroupCount;

		// Get a snapshot of the group list 
		// (Note this does NOT do AddRefs to the groups - but see IXXXEnum below)
		//
		GetUnkList(OPC_ENUM_ALL_CONNECTIONS, &GroupList, &nGroupCount);

		// Create the Enumerator using the snapshot (which might be empty)
		// Note that the enumerator constructor will AddRef 
		// all of the groups.
		//
		temp = new CImpIEnumUnknown(this, nGroupCount, GroupList, pIMalloc);
		delete [] GroupList;

		if (NULL == temp)
		{
			return E_OUTOFMEMORY;
		}

		// Then QI for the interface ('temp') actually is the interface
		// but QI is the 'proper' way to get it.
		// Note QI will do an AddRef of the Enum which will also do
		// an AddRef of the 'parent' - i.e. the 'this' pointer passed above.
		//
		hr = temp->QueryInterface(iid, ppInterface);
		if (FAILED(hr))
		{
			delete temp;
			return hr;
		}

		// If all OK - return here 
		// Unlike most interfaces this one does NOT directly addref the server
		// (since we created a new and independent object)
		//
		return S_OK;
	}
	// No interface available
	else
	{
		*ppInterface = NULL;
	}
	
	if (NULL == *ppInterface)
	{
		return E_NOINTERFACE;
	}

	// Record the reference to the new object.
	//
	((LPUNKNOWN)*ppInterface)->AddRef();
	return S_OK;
}


/////////////////////////////////////////////////////////////////////////////
// Private (non-OPC) Utility Functions
//


////////////////////////////////////////////////////////////////
// COPCDrvServer::Init()
//
// Initializes the object
//
// Returns:
//	S_OK		success
//	E_FAIL		failure
//
////////////////////////////////////////////////////////////////
HRESULT COPCDrvServer::Init(void)
{
	// Connect to the driver's automation interface
	//
	if (FAILED(GetDriverInfo()))
	{
		m_pIDriver = NULL;
		m_pIDriverMessage = NULL;
		LogEventMessage(TEXT("CoCreateInstance() failed. Unable to connect to automation interface"),
						g_tszAcronym,
						3);
		return E_FAIL;
	}

	// Fire off the main poll thread that does all of the work
	//
	unsigned int nAddress = 0;
	m_hPollThread = (HANDLE)_beginthreadex(NULL,
										   0,
										   PollThread, 
										   (LPVOID)this, 
										   0, 
										   &nAddress);
	if (NULL == m_hPollThread)
	{
		LogEventMessage(TEXT("_beginthreadex failed. Unalbe to create polling thread"),
						g_tszAcronym,
						3);
		return E_FAIL;
	}

	// Plug this server into the map for bandwidth calculations.
	//
	if (!FindServerSlot(&m_Slot, this))
	{
		LogEventMessage(TEXT("Unable to initialize server object"),
						g_tszAcronym,
						3);
	}

	return S_OK;
}


////////////////////////////////////////////////////////////////
// COPCDrvServer::GetNameList()
//
// Create a list of all the group names.
//
// Returns:
//	void
//
////////////////////////////////////////////////////////////////
void COPCDrvServer::GetNameList(OPCENUMSCOPE	OPCScope, 
								LPOLESTR		**ppGroupList, 
								int				*pnGroupCount)
{
	int				nNumGroups	= 0,
					i			= 0;
	LPOLESTR		*mylist		= NULL;
	OPCHANDLE		OPCHandle	= 0;
	COPCDrvGroup	*pGroup		= NULL;
	POSITION		posGroup;


	// Initialize return parameters
	*ppGroupList = NULL;
	*pnGroupCount = 0;

	// Lock the server object
	//
	this->Lock();

	// Get the info about the group list
	//
	nNumGroups	= this->GetNumGroupHandles();
	posGroup	= this->GetFirstGroupPosition();

	// See if there is anything to enumerate
	//
	if (0 == nNumGroups)
	{
		this->UnLock();
		return;
	}

	switch(OPCScope)
	{
	case OPC_ENUM_PRIVATE_CONNECTIONS:
	case OPC_ENUM_PRIVATE:
	case OPC_ENUM_ALL_CONNECTIONS:
	case OPC_ENUM_ALL:
		*ppGroupList = mylist = new LPOLESTR[nNumGroups];	// Caller must free this!
		if (*mylist == NULL)
		{
			this->UnLock();
			return;
		}
		for (i = 0; i < nNumGroups; i++)
		{
			this->GetNextGroup(posGroup, OPCHandle, pGroup);

			// Note that the string is cloned to keep the enumerator 'stable'
			//
			mylist[*pnGroupCount] = WSTRClone(pGroup->m_szName, NULL);
			(*pnGroupCount)++;
		}
		break;

	case OPC_ENUM_PUBLIC:
	case OPC_ENUM_PUBLIC_CONNECTIONS:
		break;
	default:
		// Should never happen!!
		TRACE("Invalid scope passed to GetNameList() (%d), File %s, Line %d\n", 
			OPCScope, __FILE__, __LINE__);
		break;
	}

	// Unlock the server object
	//
	this->UnLock();
}


////////////////////////////////////////////////////////////////
// COPCDrvServer::FreeNameList()
//
// Free a list of group names.
//
// Returns:
//	void
//
////////////////////////////////////////////////////////////////
void COPCDrvServer::FreeNameList(LPOLESTR	*ppGroupList, 
								 int		nCount)
{

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美在线观看一区二区三区| 日韩av不卡一区二区| 国产精品一区二区男女羞羞无遮挡| 91精品免费观看| 久久超碰97中文字幕| 精品久久人人做人人爰| 国产资源在线一区| 久久久蜜桃精品| www.在线欧美| 一区二区三区国产精华| 宅男在线国产精品| 另类调教123区| 欧美国产一区二区| 91福利在线看| 免费高清视频精品| 久久先锋影音av| 波多野结衣的一区二区三区| 亚洲猫色日本管| 91精品欧美久久久久久动漫| 国产一区二区三区四| 亚洲视频一区二区在线观看| 欧美专区日韩专区| 美女一区二区久久| 国产精品入口麻豆九色| 色婷婷综合久久久中文一区二区| 午夜免费久久看| 久久久噜噜噜久噜久久综合| 91久久一区二区| 久久精品国产澳门| 亚洲人成精品久久久久久 | 亚洲成人av一区| 精品日本一线二线三线不卡| av电影在线观看一区| 偷拍一区二区三区四区| 国产精品乱码一区二区三区软件| 欧美视频第二页| 懂色av噜噜一区二区三区av| 亚洲成在线观看| 国产欧美日韩另类视频免费观看| 欧美午夜影院一区| 成人一区二区三区中文字幕| 五月天激情综合| 中文字幕欧美日韩一区| 欧美日韩国产在线播放网站| 成a人片国产精品| 麻豆成人免费电影| 亚洲一区二区三区四区在线 | 欧美妇女性影城| 99视频国产精品| 国产伦精品一区二区三区免费 | 日韩av电影免费观看高清完整版 | 亚洲视频在线一区观看| 日韩精品一区在线观看| 91网站在线播放| 奇米影视一区二区三区| 国产精品久久久久久久午夜片| 欧美三级日韩在线| 国产一区激情在线| 亚洲女爱视频在线| 久久久久久久性| 欧美日本视频在线| aaa欧美色吧激情视频| 秋霞影院一区二区| 一区二区三区日韩| 精品久久人人做人人爰| 日韩一区二区精品在线观看| 成人av在线资源网| 精品一区二区在线观看| 亚洲欧美aⅴ...| 国产欧美精品国产国产专区| 91.com视频| 色综合天天做天天爱| 国产一区二区电影| 日韩一区欧美二区| 一区二区三区av电影| 91精品久久久久久久久99蜜臂| 粉嫩绯色av一区二区在线观看 | 日本久久一区二区三区| 国产精品18久久久久久久久久久久| 久久精品国产亚洲5555| 亚洲国产中文字幕| 亚洲精选视频在线| 国产欧美久久久精品影院| 精品国产露脸精彩对白| 欧美老人xxxx18| 91黄色免费网站| 99久久伊人精品| 成人免费毛片高清视频| 国产乱人伦偷精品视频免下载| 亚洲人成精品久久久久久| 亚洲女同一区二区| 亚洲欧美激情插| 亚洲欧美日韩国产成人精品影院| 国产欧美日韩三级| 久久久久高清精品| 久久免费视频一区| 久久亚洲一级片| 精品噜噜噜噜久久久久久久久试看| 日韩一区二区在线看| 欧美福利一区二区| 日韩一级视频免费观看在线| 在线电影院国产精品| 欧美日韩国产首页在线观看| 欧美视频在线播放| 欧美日韩不卡一区二区| 欧美一区日韩一区| 欧美mv和日韩mv的网站| 久久这里只精品最新地址| 精品国产一区二区三区久久久蜜月| 884aa四虎影成人精品一区| 亚洲品质自拍视频网站| 亚洲女人小视频在线观看| 玉米视频成人免费看| 亚洲福利视频一区二区| 日韩电影在线观看电影| 精品一区二区免费| 国产jizzjizz一区二区| 成人18精品视频| 欧美在线免费观看视频| 日韩一区二区免费在线电影| 久久九九久久九九| 久久精品一区八戒影视| 亚洲欧美综合在线精品| 亚洲成人一区二区| 看电影不卡的网站| 国产乱子伦视频一区二区三区| 成人动漫一区二区在线| 在线中文字幕一区二区| 日韩一级二级三级| 国产精品美女久久久久av爽李琼 | 亚洲综合在线视频| 天天色图综合网| 国产综合色产在线精品| 91浏览器入口在线观看| 91.com视频| 国产精品久久久久一区二区三区| 一区二区三区在线播放| 日本欧美韩国一区三区| 色婷婷综合久久久中文字幕| 精品欧美一区二区在线观看 | 蜜桃在线一区二区三区| 国产精品18久久久久久久网站| 国产福利电影一区二区三区| 欧美午夜影院一区| 久久综合国产精品| 一区二区三区免费看视频| 国精产品一区一区三区mba视频| 一本一本大道香蕉久在线精品| 亚洲色图在线播放| 久久99精品国产.久久久久| 在线视频综合导航| 国产日韩欧美亚洲| 日韩制服丝袜av| 欧美人与禽zozo性伦| 一区在线播放视频| 美女一区二区三区| 91久久精品国产91性色tv| 国产精品久久久久久久久快鸭 | 精品一区二区三区视频| 91免费版在线| 久久久91精品国产一区二区精品 | 亚洲欧美国产毛片在线| 国产精品综合一区二区三区| 欧美日韩精品一区二区| 亚洲免费观看高清完整版在线观看熊| 国产大陆a不卡| 亚洲精品在线免费观看视频| 夜夜嗨av一区二区三区中文字幕| 成人深夜视频在线观看| 精品国产凹凸成av人导航| 日韩中文字幕一区二区三区| 在线免费精品视频| 亚洲免费看黄网站| 91丨porny丨户外露出| 日本一区二区三区久久久久久久久不 | 欧美视频完全免费看| 亚洲日本韩国一区| 国产传媒欧美日韩成人| 欧美成人精品1314www| 偷窥国产亚洲免费视频| 欧美色综合久久| 亚洲国产视频一区| 欧美亚洲综合一区| 亚洲自拍偷拍图区| 欧美一区二区三区在线视频| 午夜欧美一区二区三区在线播放| 欧美综合天天夜夜久久| 亚洲国产日韩精品| 欧美男女性生活在线直播观看| 亚洲国产一二三| 欧美日韩国产另类一区| 亚洲欧洲成人自拍| 欧美亚洲高清一区二区三区不卡| 亚洲精品乱码久久久久久日本蜜臀| 91视频www| 亚洲女同一区二区| 日本高清不卡aⅴ免费网站| 亚洲午夜日本在线观看| 在线成人小视频| 另类小说综合欧美亚洲|