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

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

?? impiopcbrowseserveraddressspace.cpp

?? 基于Intellution開發包的開發的OPC服務器
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
// ImpIOPCBrowseServerAddressSpace.cpp
//
//  This file contains the implementation of 
//  the IOPCBrowseServerAddressSpace interface for the OPC server.
//
//
//	(c) COPYRIGHT 1996-1998, INTELLUTION INC.
// ALL RIGHTS RESERVED
//
//
//	Functions defined in this module:
//
//			CImpIOPCBrowseServer::CImpIOPCBrowseServer()
//			CImpIOPCBrowseServer::~CImpIOPCBrowseServer()
//			CImpIOPCBrowseServer::AddRef()
//			CImpIOPCBrowseServer::Release()
//			CImpIOPCBrowseServer::QueryInterface()
//			CImpIOPCBrowseServer::QueryOrganization()
//			CImpIOPCBrowseServer::BrowseOPCItemIDs()
//			CImpIOPCBrowseServer::GetItemID()
//			CImpIOPCBrowseServer::BrowseAccessPaths()
//			CImpIOPCBrowseServer::BrowseHierarchial()
//			CImpIOPCBrowseServer::BrowseFlat()
//			CImpIOPCBrowseServer::GetDeviceList()
//			CImpIOPCBrowseServer::GetDatablockList()
//			CImpIOPCBrowseServer::GetVariableStringFromName()
//			CImpIOPCBrowseServer::GetDataBlockPropertyList()
//			CImpIOPCBrowseServer::FreeDataBlockPropertyList()
//			CImpIOPCBrowseServer::GetDataBlockPropertyData()
//			CImpIOPCBrowseServer::FreeMapMemory()
//			CImpIOPCBrowseServer::GetHandleFromName()
//			CImpIOPCBrowseServer::GetFilter()
//			CImpIOPCBrowseServer::FilterString()
//			CreateEmptyStringEnumerator()
//
//
//
// Modification Log:
//	Vers	Date     By		Notes
//	----	-------- ---	-----
//	1.1		09/04/97 jra	Created
//	1.3		03/10/98 jra	Modified to be wizard generated and driver specific.
//	7.11	10/14/98 jra	Modified GetDeviceList() because browsing would not work
//							if the driver had multiple channels defined. Basically,
//							we cleared the variant that held the channel handles too soon.
//
//

#define WIN32_LEAN_AND_MEAN

// Microsoft headers
#include "OpcStdAfx.h"
#include <afxconv.h>
#include <malloc.h>

// Project headers
#include "OPCDrv.h"
#include "OPC.h"
#include <InterfaceDef.h>


////////////////////////////////////////////////////////////////
// External global variables
extern IMalloc *pIMalloc;
extern TCHAR	g_tszAcronym[];


////////////////////////////////////////////////////////////////
// Local functions
static HRESULT	CreateEmptyStringEnumerator(IEnumString **);


////////////////////////////////////////////////////////////////
// External functions
extern HRESULT NewArray(unsigned long lElements, SAFEARRAY ** ppsaArray);


////////////////////////////////////////////////////////////////
// Local definitions
#define	IOADDRESS_DELIM					':'
#define	HINT_STRING						" (*hint: StartAddr - EndAddr)"
#define HINT_DELIM						" - "
#define KEY_BUFF_SIZE					20
#define SIZE_OF_PROPERTY_STRINGS		20
#define	SIZE_OF_PROPERTY_DATA_STRINGS	20


////////////////////////////////////////////////////////////////
// Globals defined in this module
//
// TODO:	Add/remove properties to the following two-dimensional array
//			for browsing datablocks
//
//////////////////////////////////////////////////////////////
static char g_pszDataBlockProps[][SIZE_OF_PROPERTY_STRINGS] = {
	"StartAddress",
	"EndAddress"
};
static long g_lNumDataBlockProps = sizeof(g_pszDataBlockProps) / SIZE_OF_PROPERTY_STRINGS;

// Macros used for retrieving property data from the data list.
//
// TODO:	The macros index must correspond to the index of the property string in
//			the g_pszDataBlockProps[][] list above, so if you add/remove properties
//			from it, you must add/remove/change the property indexes below.
//			Do NOT change GetDataFromList().
//
//////////////////////////////////////////////////////////////
#define	START_ADDRESS_PROP		0
#define END_ADDRESS_PROP		1
//mvs11272000 - Get size of property data strings
#define	GetDataFromList(pszList, nIndex)	(pszList + (SIZE_OF_PROPERTY_DATA_STRINGS * nIndex))


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


////////////////////////////////////////////////////////////////
// CImpIOPCBrowseServer::CImpIOPCBrowseServer()
//
// @desc Constructor for this Interface
//
// TODO:	Add any initialization code here
//
////////////////////////////////////////////////////////////////
CImpIOPCBrowseServer::CImpIOPCBrowseServer(LPUNKNOWN pUnkOuter)
{
	// Initialize object members
	m_dwLevel			= DEVICE_LEVEL;
	m_pUnkOuter			= pUnkOuter;
	m_pParentServer		= (COPCDrvServer *)pUnkOuter;

	InitializeCriticalSection(&this->m_Lock);

	if (FAILED(GetDataBlockPropertyList()))
	{
		LogEventMessage(TEXT("Unable to create datablock property array"),
						g_tszAcronym,
						3);
	}
}


////////////////////////////////////////////////////////////////
// CImpIOPCBrowseServer::~CImpIOPCBrowseServer()
//
// @desc Destructor for this Interface
//
// TODO:	Add any clean-up code here
//
////////////////////////////////////////////////////////////////
CImpIOPCBrowseServer::~CImpIOPCBrowseServer()
{
	m_pParentServer->m_pCImpIOPCBrowseServer = NULL;
	
	if (FAILED(FreeDataBlockPropertyList()))
	{
		LogEventMessage(TEXT("Unable to free datablock property array"),
						g_tszAcronym,
						3);
	}

	DeleteCriticalSection(&this->m_Lock);
}



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


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


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


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



////////////////////////////////////////////////////////////////
// IOPCBrowseServerAddressSpace interface functions


////////////////////////////////////////////////////////////////
// CImpIOPCBrowseServer::QueryOrganization()
//
// @desc Returns to the calling client that this server uses a 
//			Hierarchical name space format.
//
// @parm	[out] OPCNAMESPACETYPE * | pNameSpaceType| Returned name space type
//
// @retval	S_OK			success
// @retval	E_INVALIDARG	an invalid parameter was passed
//
// TODO:	Generally nothing, unless your driver requires flat browsing
//			instead of hierarchial.
//
////////////////////////////////////////////////////////////////
STDMETHODIMP CImpIOPCBrowseServer::QueryOrganization(OPCNAMESPACETYPE *pNameSpaceType)
{ 
	// Make sure we don't get a bad pointer.
	//
	if (NULL == pNameSpaceType)
	{
		return E_INVALIDARG;
	}

	// This server supports a hierarchial address space.
	//
	*pNameSpaceType = OPC_NS_HIERARCHIAL;	
	return S_OK;
}


////////////////////////////////////////////////////////////////
// CImpIOPCBrowseServer::ChangeBrowsePosition()
//
// @desc This function provides a way to move 'up' and 'down' in the
//			OPC Server's Hierarchial address space.
//
// @parm	[in] OPCBROWSEDIRECTION	| dwDirection | Direction to change the browse to
// @parm	[in, string] LPCWSTR	| wszString	  | When browsing down, this is the branch
//													to move into
// 
// @retval	S_OK			success
// @retval	E_INVALIDARG	an invalid parameter was passed
// @retval	E_FAIL			failure
//
// TODO:	Modify the switch statement to add/remove any levels of
//			browsing required.
//
////////////////////////////////////////////////////////////////
STDMETHODIMP CImpIOPCBrowseServer::ChangeBrowsePosition(OPCBROWSEDIRECTION	dwDirection,
														LPCWSTR				wszString)
{
	// Check for bad pointers...
	//
	if (NULL == wszString)
	{
		return E_INVALIDARG;
	}


	// If we get a NULL string, that indicates they want the ROOT level
	//
	if ((NULL == *wszString) && (OPC_BROWSE_DOWN == dwDirection))
	{
		m_dwLevel = DEVICE_LEVEL;
		m_szDeviceName.Empty();
		return S_OK;
	}

	// See which direction the user wants to go
	//
	switch(dwDirection)
	{
	case OPC_BROWSE_UP:
		switch(m_dwLevel)
		{
		case DEVICE_LEVEL:
			return E_INVALIDARG;	// No where to go!!
			break;

		case DATABLOCK_LEVEL:
			m_dwLevel = DEVICE_LEVEL;
			break;

		default:
			// Should never happen!
			TRACE("Invalid browse level (%lu), File %s, Line %d\n", 
				m_dwLevel, __FILE__, __LINE__);
			return E_FAIL;
			break;
		}
		break;

	case OPC_BROWSE_DOWN:
		switch(m_dwLevel)
		{
		case DEVICE_LEVEL:
			m_szDeviceName = wszString;
			m_dwLevel = DATABLOCK_LEVEL;
			break;

		case DATABLOCK_LEVEL:
			return E_INVALIDARG;	// No where to go!!
			break;

		default:
			// Should never happen!
			TRACE("Invalid browse level (%lu), File %s, Line %d\n", 
				m_dwLevel, __FILE__, __LINE__);
			return E_FAIL;
			break;
		}
		break;

	default:
		return E_INVALIDARG;
		break;
	}

	return S_OK; 
}


////////////////////////////////////////////////////////////////
// CImpIOPCBrowseServer::BrowseOPCItemIDs()
//
// @desc This function returns a string enumeration list for a list
//		 of ItemIDs depending on the given parameters and filtering.
//		 The position from which to browse can be changed by calling
//		 ChangeBrowsePosition().
//
// @parm	[in] OPCBROWSETYPE	 | dwBrowseFilterType	| browse type
// @parm	[in, string] LPCWSTR | szFilterCriteria		| filtering string
// @parm	[in] VARTYPE		 | vtDataTypeFilter		| datatype filter
// @parm	[in] DWORD			 | dwAccessRightsFilter	| access rights filter
// @parm	[out] LPENUMSTRING * | ppIEnumString		| returned string enumerator
//
// @retval	S_OK			success
// @retval	E_FAIL			failure
// @retval	E_INVALIDARG	an invalid parameter was passed in
// @retval	E_OUTOFMEMORY	out of memory (allocator failed)
// @retval	S_FALSE			There is nothing to enumerate
//
// @devnote The client is responsible for freeing any allocated
//			memory associated with the enumeration list.
//
// TODO:	Add any filtering, browse levels, etc that your driver requires.
//
////////////////////////////////////////////////////////////////
STDMETHODIMP CImpIOPCBrowseServer::BrowseOPCItemIDs(OPCBROWSETYPE	dwBrowseFilterType,
													LPCWSTR			szFilterCriteria,
													VARTYPE			vtDataTypeFilter,
													DWORD			dwAccessRightsFilter,
													LPENUMSTRING	*ppIEnumString)
{
	LPOLESTR			*ppStringArray			= NULL;
	WCHAR				*pwcString				= NULL;
	int					nIndex					= 0,
						nNumLoops				= 1;
	long				lNumEntries				= 0L,
						lHandle					= 0L;
	CImpIEnumString		*pEnumString			= NULL;
	CString				szFilterSearchString	= szFilterCriteria;
	DWORD				dwTempLevel				= this->m_dwLevel;
	BOOL				bFilterFromEnd			= FALSE;
	HRESULT				hr;
	POSITION			posMap;
	CLongPtrMap			mapStrings;
	FILTERTYPE			dwFilterType;
	

	// Make sure that we have a good pointer for the enumeration
	//
	if (NULL == ppIEnumString)
	{
		return E_INVALIDARG;
	}

	// Macro required for ATL string conversions
	//
	USES_CONVERSION;

	///////////////////////////////////////
	//
	// See if the user wants to do anything with filtering
	//
	///////////////////////////////////////


	//
	// Switch on the datatype filtering
	//
	switch(vtDataTypeFilter)
	{
	// These datatypes are inherently supported by the toolkit
	//
	case VT_R4:
	case VT_BSTR:
	case VT_BOOL:
	case VT_I2:
	case VT_I4:
	case VT_EMPTY:
	/////////////////////////////////////////////////////////////
	//
	// TODO: Add any additional datatypes here that your driver supports
	//		 or remove datatypes that your driver does not support
	//
	/////////////////////////////////////////////////////////////
		break;

	// Anything else is not supported, so return that there is nothing
	// to enumerate
	default:
		return CreateEmptyStringEnumerator(ppIEnumString);
	}


	//
	// switch on the access rights filtering type (currently not used)
	//
	switch(dwAccessRightsFilter)
	{
	default:
	case OPC_READABLE:
	case OPC_WRITEABLE:
	case (OPC_READABLE | OPC_WRITEABLE):
		break;
	}


	//
	// Go get the filtering type and search string.
	//
	GetFilter(szFilterSearchString, dwFilterType);


	//
	// Switch on the browse filtering type
	//
	switch (dwBrowseFilterType)
	{
	// Only datablocks don't have children, so if we are not at that level, then
	// return that their is nothing to enumerate.
	//
	case OPC_LEAF:
		if (DATABLOCK_LEVEL != m_dwLevel)
		{
			return CreateEmptyStringEnumerator(ppIEnumString);
		}

		hr = BrowseHierarchial(&mapStrings,
							   &lNumEntries,
							   dwBrowseFilterType,
							   szFilterSearchString,
							   dwFilterType);
		if (FAILED(hr))
		{
			*ppIEnumString = NULL;
			FreeMapMemory(&mapStrings);
			return E_FAIL;
		}
		break;

	// Only devices have children, so if we are not at that
	// level, then return that their is nothing to enumerate
	//
	case OPC_BRANCH:
		if (DEVICE_LEVEL != m_dwLevel)
		{
			return CreateEmptyStringEnumerator(ppIEnumString);
		}

		hr = BrowseHierarchial(&mapStrings,
							   &lNumEntries,
							   dwBrowseFilterType,
							   szFilterSearchString,
							   dwFilterType);
		if (FAILED(hr))
		{
			*ppIEnumString = NULL;
			FreeMapMemory(&mapStrings);
			return E_FAIL;
		}
		break;

	case OPC_FLAT:
		hr = BrowseFlat(&mapStrings,
						&lNumEntries,
						szFilterSearchString,
						dwFilterType);
		if (FAILED(hr))
		{
			*ppIEnumString = NULL;
			FreeMapMemory(&mapStrings);
			return hr;
		}
		break;

	default:
		// Should never happen!!
		*ppIEnumString = NULL;
		TRACE("Invalid Search Filter type, File %s, Line %d\n", 
				__FILE__, __LINE__);
		return E_INVALIDARG;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本不卡免费在线视频| 91精品国产麻豆| 首页国产欧美久久| 国产亚洲制服色| 成人影视亚洲图片在线| 国产午夜精品久久久久久久| 91行情网站电视在线观看高清版| 一区二区三区精品视频在线| 精品剧情v国产在线观看在线| 国产乱子轮精品视频| 亚洲婷婷综合色高清在线| 日韩欧美色综合网站| 日本道色综合久久| 国产一区高清在线| 免费欧美日韩国产三级电影| 亚洲免费av高清| 国产拍揄自揄精品视频麻豆| 5858s免费视频成人| 91免费版pro下载短视频| 激情综合网激情| 日韩国产高清影视| 亚洲123区在线观看| 国产精品剧情在线亚洲| 日本一区二区免费在线| 色成人在线视频| 国产福利一区二区| 国产精品综合网| 国产成人在线观看| 国产精品456| 国产成a人亚洲精| 国产精品一区二区在线看| 久久超碰97中文字幕| 免费一级片91| 精品影院一区二区久久久| 久久精工是国产品牌吗| 精品一区二区在线播放| 国产精品久久影院| 成人av网在线| 国产.欧美.日韩| 不卡一区中文字幕| 在线免费av一区| 91精品国产福利| 欧美电影精品一区二区 | 日韩精品电影在线观看| 亚洲第一精品在线| 久久精品国产一区二区三| 黄色精品一二区| 97久久超碰国产精品| 欧美影视一区在线| 久久一日本道色综合| 国产精品丝袜一区| 午夜精品福利一区二区蜜股av| 日本不卡一区二区三区| 国产麻豆视频精品| 欧美视频日韩视频在线观看| 欧美丰满少妇xxxxx高潮对白| 欧美一区二区精美| 亚洲免费大片在线观看| 精品亚洲国内自在自线福利| 91尤物视频在线观看| 日韩一区二区免费在线观看| 久久久国产精品午夜一区ai换脸 | 久久精品亚洲麻豆av一区二区| 国产精品二三区| 麻豆成人综合网| 91精品办公室少妇高潮对白| 精品久久久久99| 亚洲国产三级在线| 丁香桃色午夜亚洲一区二区三区| 欧美一区二区网站| 五月激情综合网| 欧美日韩国产影片| 亚洲日本免费电影| av一区二区三区四区| 国产亚洲精品精华液| 亚洲影院理伦片| 精品视频一区二区不卡| 亚洲男人的天堂在线观看| 成人av手机在线观看| 日本一区二区在线不卡| 国产精品一卡二卡在线观看| 日韩一区二区精品| 蓝色福利精品导航| 亚洲精品在线免费观看视频| 六月丁香婷婷久久| 欧美系列日韩一区| 亚洲国产精品一区二区久久 | 久久久国产午夜精品| 国产在线精品免费av| 久久精品夜夜夜夜久久| 国产乱国产乱300精品| 国产日韩影视精品| 成人av动漫网站| 亚洲精品精品亚洲| 99亚偷拍自图区亚洲| 亚洲天堂中文字幕| 欧美在线色视频| 日本sm残虐另类| 日韩美女一区二区三区四区| 97久久精品人人爽人人爽蜜臀 | 国产亚洲一区二区三区在线观看| 蜜桃av噜噜一区| 国产精品色噜噜| 欧美在线啊v一区| 久久99国产精品久久99果冻传媒| 精品国产伦一区二区三区观看方式 | 国产精品国产三级国产aⅴ入口| 成人app下载| 日韩成人dvd| 国产精品嫩草影院com| 欧美麻豆精品久久久久久| 国产精品自在在线| 亚洲福利一二三区| 国产精品午夜在线观看| 欧美巨大另类极品videosbest| 亚洲综合一区二区精品导航| 欧美一区在线视频| 国产精品视频观看| 色婷婷av一区二区三区gif| 激情偷乱视频一区二区三区| 日本不卡视频在线| 日韩高清不卡一区二区| 日本成人在线看| 久久99久久99小草精品免视看| 久久成人羞羞网站| 国产99一区视频免费| 秋霞午夜鲁丝一区二区老狼| 中文字幕永久在线不卡| 制服丝袜激情欧洲亚洲| 国产精品综合网| 老司机精品视频一区二区三区| 一区二区久久久久久| 亚洲精品一区二区在线观看| 三级精品在线观看| 中文字幕在线观看不卡视频| 欧美一级久久久| 欧美男同性恋视频网站| 一本到不卡精品视频在线观看| 成人精品视频一区| 狠狠色伊人亚洲综合成人| 亚洲风情在线资源站| 综合分类小说区另类春色亚洲小说欧美 | 中文字幕一区不卡| 久久福利视频一区二区| 伊人性伊人情综合网| 国产精品视频在线看| 欧美日韩卡一卡二| 国产91综合一区在线观看| 成人免费视频在线观看| 色av综合在线| 在线观看一区日韩| 欧美精选一区二区| 亚洲免费观看高清完整| 国产成人精品亚洲午夜麻豆| 91精品国产欧美日韩| 亚洲一区二区视频| 91丨porny丨国产| 精品国产髙清在线看国产毛片| 中文字幕欧美激情一区| 精品日本一线二线三线不卡| 2023国产精品| 夜夜揉揉日日人人青青一国产精品 | 久久久久成人黄色影片| 亚洲欧美中日韩| 日韩精品久久理论片| 蜜桃av一区二区三区电影| 天天综合色天天综合| 中文字幕中文在线不卡住| 1024国产精品| 亚洲女同ⅹxx女同tv| 五月激情六月综合| 亚洲伦理在线免费看| 国产精品免费久久| 免费人成在线不卡| 91丝袜美腿高跟国产极品老师 | 最近中文字幕一区二区三区| 美女一区二区在线观看| 欧美精品色一区二区三区| 专区另类欧美日韩| 成人h精品动漫一区二区三区| 日韩三级在线观看| 日韩在线播放一区二区| 91国产精品成人| 最新不卡av在线| 不卡欧美aaaaa| 国产精品国产三级国产a| 成人综合婷婷国产精品久久| 久久日韩粉嫩一区二区三区 | av在线一区二区三区| 亚洲国产高清不卡| 91福利在线看| 首页国产欧美日韩丝袜| 精品区一区二区| 国产综合一区二区| 日韩免费视频线观看| 亚洲欧美在线观看| 老司机精品视频一区二区三区| 成年人国产精品| 久久亚洲精品国产精品紫薇| 狠狠色丁香久久婷婷综合_中|