亚洲欧美第一页_禁久久精品乱码_粉嫩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精品久久久久久蜜臀| 国产日韩欧美电影| 美女在线视频一区| 日本韩国欧美国产| 国产精品理伦片| 国产成人av电影| 欧美大度的电影原声| 午夜精品久久久久久久99水蜜桃 | 国产日韩欧美精品一区| 亚洲成人午夜影院| 色婷婷综合久久| 国产精品免费视频观看| 国产一级精品在线| 欧美一区二区三级| 亚洲国产综合人成综合网站| 国产精品一线二线三线精华| 精品奇米国产一区二区三区| 日韩电影免费一区| 欧美日韩免费一区二区三区 | 一本大道综合伊人精品热热| 久久尤物电影视频在线观看| 男人操女人的视频在线观看欧美| 欧美三级三级三级| 亚洲国产欧美在线| 欧美性做爰猛烈叫床潮| 亚洲精品免费看| 91丨porny丨蝌蚪视频| 国产精品欧美极品| 北条麻妃国产九九精品视频| 国产精品久久久久久久久免费丝袜| 国模少妇一区二区三区| 久久久蜜臀国产一区二区| 麻豆精品视频在线观看视频| 欧美一级艳片视频免费观看| 久久91精品久久久久久秒播| 精品三级av在线| 懂色av中文一区二区三区| 国产午夜亚洲精品午夜鲁丝片| 国产激情91久久精品导航| 国产精品久久久久久久久动漫 | 成人综合在线网站| 国产精品免费免费| 91精品91久久久中77777| 亚洲综合色成人| 日韩一区二区免费高清| 精品一区二区三区蜜桃| 国产日韩av一区二区| 99国产精品视频免费观看| 亚洲一二三专区| 日韩三级精品电影久久久 | 久久精品一区二区三区不卡牛牛 | 色中色一区二区| 亚洲成av人**亚洲成av**| 日韩一区二区在线播放| 国产一区二区不卡在线| 综合久久久久久| 777奇米四色成人影色区| 国产乱码字幕精品高清av| 中文字幕第一区综合| 欧美色视频一区| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲免费在线观看视频| 555夜色666亚洲国产免| 成人午夜电影久久影院| 亚洲成a人片在线观看中文| 日韩精品专区在线影院重磅| 91在线一区二区三区| 亚洲高清三级视频| 国产欧美精品国产国产专区 | 国产成人亚洲综合a∨婷婷图片| 亚洲人午夜精品天堂一二香蕉| 91麻豆精品久久久久蜜臀| 国产成人精品1024| 日韩专区中文字幕一区二区| 国产日韩成人精品| 在线播放国产精品二区一二区四区 | 成人免费视频一区| 蜜臀精品久久久久久蜜臀| 中文字幕一区二区5566日韩| 日韩一区二区精品葵司在线| 一本一道久久a久久精品综合蜜臀| 久久精品国产77777蜜臀| 综合网在线视频| 日本一区二区三区久久久久久久久不 | 天堂一区二区在线| 亚洲精品日韩综合观看成人91| 久久一夜天堂av一区二区三区 | 欧美国产一区二区在线观看| 欧美一级高清大全免费观看| 色素色在线综合| 成人午夜免费视频| 国产精品一区专区| 奇米一区二区三区av| 亚洲大尺度视频在线观看| 国产精品蜜臀av| 日本一区二区三区在线观看| 精品日韩欧美一区二区| 欧美一二三区在线观看| 欧美乱妇23p| 欧美日韩1234| 欧美日韩高清一区二区不卡| 日本精品一级二级| 色噜噜偷拍精品综合在线| 成人性生交大片免费看视频在线| 精品无码三级在线观看视频| 麻豆精品一区二区av白丝在线| 青青草97国产精品免费观看无弹窗版 | 国产精品18久久久久久久久久久久 | 91婷婷韩国欧美一区二区| 成人一区二区三区| 成人国产视频在线观看| 成人综合在线观看| 不卡在线观看av| 92精品国产成人观看免费| 99精品久久只有精品| 91在线播放网址| 一本色道久久综合亚洲aⅴ蜜桃 | 99视频在线观看一区三区| 不卡免费追剧大全电视剧网站| gogogo免费视频观看亚洲一| 色综合天天综合色综合av| 色婷婷亚洲精品| 精品视频色一区| 欧美一级二级三级蜜桃| 亚洲精品一区二区三区影院| 久久久精品天堂| 中文字幕一区三区| 亚洲国产精品一区二区www| 日韩主播视频在线| 国内精品嫩模私拍在线| 成人av网站在线观看| 91激情在线视频| 欧美人与禽zozo性伦| 欧美精品一区二| 最好看的中文字幕久久| 三级亚洲高清视频| 狠狠狠色丁香婷婷综合激情| www.欧美色图| 5858s免费视频成人| 久久久久久久电影| 亚洲欧美另类图片小说| 蜜臀精品一区二区三区在线观看 | 久久国产免费看| 成人av免费网站| 欧美三级电影在线观看| 欧美va天堂va视频va在线| 国产精品成人一区二区艾草 | 久久这里只精品最新地址| 亚洲乱码精品一二三四区日韩在线| 亚洲成人免费视频| 国产一区二区免费视频| 日本韩国精品在线| 久久亚洲捆绑美女| 亚洲一区二区三区四区五区黄| 精品无人区卡一卡二卡三乱码免费卡| 波多野结衣中文字幕一区 | 91精品国产91久久久久久一区二区 | 26uuu国产一区二区三区| 亚洲精品免费视频| 国产福利一区在线| 欧美日韩三级一区| 国产精品久久久久aaaa樱花| 免费不卡在线视频| 日本乱人伦aⅴ精品| 久久久久久一级片| 午夜成人在线视频| 91蜜桃婷婷狠狠久久综合9色| 精品91自产拍在线观看一区| 亚洲线精品一区二区三区八戒| 国产高清无密码一区二区三区| 欧美日本国产视频| 一区二区三区欧美亚洲| 成人av资源在线| 久久亚洲综合色一区二区三区| 日韩成人伦理电影在线观看| 91九色最新地址| 综合久久久久久| 成人亚洲精品久久久久软件| 亚洲精品一区二区三区蜜桃下载 | 亚洲午夜久久久久久久久电影网| 国产69精品久久777的优势| 精品免费日韩av| 青青草伊人久久| 在线不卡中文字幕播放| 亚洲一区中文日韩| 欧美综合一区二区| 亚洲日本青草视频在线怡红院| 国产sm精品调教视频网站| 久久久综合精品| 韩国视频一区二区| 日韩精品自拍偷拍| 韩国三级中文字幕hd久久精品| 日韩亚洲欧美综合| 美女视频网站黄色亚洲| 日韩一区二区三区四区| 另类人妖一区二区av| 精品国产免费视频| 日本视频一区二区|