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

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

?? impiopcbrowseserveraddressspace.cpp

?? 基于Intellution開發包的開發的OPC服務器
?? CPP
?? 第 1 頁 / 共 4 頁
字號:
	for (long lIndex = 0; lIndex < g_lNumDataBlockProps; lIndex++)
	{
		if (SUCCEEDED(hr = SafeArrayGetElement(vPropertyData.parray,
											   &lIndex, &vTemp)))
		{
			// Change the variant to a bstr
			if (FAILED(hr = VariantChangeType(&vTemp, &vTemp, 0, VT_BSTR)))
			{
				VariantClear(&vTemp);
				return E_FAIL;
			}

			szData = vTemp.bstrVal;
			VariantClear(&vTemp);

			strncpy(pszPropertyData, szData, SIZE_OF_PROPERTY_DATA_STRINGS);
			pszPropertyData += SIZE_OF_PROPERTY_DATA_STRINGS;
		}
	}

	VariantClear(&vPropertyData);
	VariantClear(&vErrors);
	VariantClear(&vTemp);
	return S_OK;
}


////////////////////////////////////////////////////////////////
// void CImpIOPCBrowseServer::FreeMapMemory()
//
// @desc Frees all dynamic memory allocated and stored with a CMap.
//
// @parm CLongPtrMap * | pMap | Pointer to the map whose memory needs to be freed
//
// @retval	none
//
// TODO:	Nothing
//
////////////////////////////////////////////////////////////////
void CImpIOPCBrowseServer::FreeMapMemory(CLongPtrMap		*pMap)
{
	POSITION	posNext = pMap->GetStartPosition();
	int			nNumEntries	= pMap->GetCount();
	long		lKey;
	WCHAR		*pwcString;


	// Loop through the map and free all of the memory associated
	// with every entry in it.
	//
	for (long i = 0; i < nNumEntries; i++)
	{
		pMap->GetNextAssoc(posNext, lKey, pwcString);
		delete [] pwcString;
		pMap->RemoveKey(lKey);
	}
}


////////////////////////////////////////////////////////////////
// HRESULT CImpIOPCBrowseServer::GetHandleFromName()
//
// @desc This function searchs a given driver's channel and device list
//		 for a specific device name Or continues to search the devices
//		 datablock list for a given datablock name. It then returns that objects's
//		 handle when found.
//
// @parm	CString | szObjectName	| Device or datablock name to get the handle for
// @parm	long &	| lObjectHandle	| Returned handle
// @parm	BOOL	| bIsDataBlock	| Object name to searhc for
// 
// @retval	S_OK	success
// @retval	E_FAIL	failure, lObjectHandle will be 0
//
// @devnote This function should not need to be modified.
//
////////////////////////////////////////////////////////////////
HRESULT CImpIOPCBrowseServer::GetHandleFromName(CString		szObjectName,
												long		&lObjectHandle,
												BOOL		bIsDataBlock)	/* = FALSE */
{
	HRESULT		hr;
	VARIANT		vChanHandlesHolder,
				vChanNamesHolder,
				vChanHandles,
				vDevHandlesHolder,
				vDevNamesHolder,
				vDevHandles,
				vDevNames,
				vDBHandlesHolder,
				vDBNamesHolder,
				vDBHandles,
				vDBNames;
	long		lNumChannels	= 0L,
				lNumDevices		= 0L,
				lNumDataBlocks	= 0L,
				lChanHandle		= 0L,
				lDeviceHandle	= 0L;
	CString		szTempName;


	// Assume failure
	//
	lObjectHandle = 0L;

	// Make sure we have a pointer to the automation interface
	//
	if (NULL == m_pParentServer->m_pIDriver)
	{
		return E_FAIL;
	}

	//
	// We won't do an AddRef() on the OLE Automation interface pointer because the
	// calling function has already done that.
	//

	// Initialize the variants
	//
	VariantInit(&vChanHandlesHolder);
	VariantInit(&vChanNamesHolder);
	VariantInit(&vChanHandles);
	VariantInit(&vDevHandlesHolder);
	VariantInit(&vDevNamesHolder);
	VariantInit(&vDevHandles);
	VariantInit(&vDevNames);
	VariantInit(&vDBHandlesHolder);
	VariantInit(&vDBNamesHolder);
	VariantInit(&vDBHandles);
	VariantInit(&vDBNames);

	// Get a list of the channels available in this driver
	//
	hr = m_pParentServer->m_pIDriver->GetChannels(&vChanHandlesHolder, 
												  &vChanNamesHolder, 
												  &lNumChannels);
	if (FAILED(hr))
	{
		return E_FAIL;
	}

	// Loop through all of the channels. Then for every channel, we will get the
	// devices and loop through them to find a match on the device name. When it
	// finds a match, we will return the device handle to the caller.
	//
	for (long i = 0; i < lNumChannels; i++)
	{
		// Extract the channel handle and name
		hr	= SafeArrayGetElement(vChanHandlesHolder.parray,
								  &i, &vChanHandles);
		if (SUCCEEDED(hr))
		{
			// Get the channel handle and name
			lChanHandle = vChanHandles.lVal;

			// Get the list of devices for this channel
			hr = m_pParentServer->m_pIDriver->GetDevices(lChanHandle, 
														 &vDevHandlesHolder, 
														 &vDevNamesHolder, 
														 &lNumDevices);
			if (FAILED(hr))
			{
				goto Error;
			}

			// Loop through the devices in search of a specific name.
			//
			for (long j = 0; j < lNumDevices; j++)
			{
				if (SUCCEEDED(hr = SafeArrayGetElement(vDevHandlesHolder.parray,
													   &j, &vDevHandles)))
				{
					// Get the device handle
					lDeviceHandle = vDevHandles.lVal;

					if (bIsDataBlock)
					{
						// Get the list of datablocks for this device
						hr = m_pParentServer->m_pIDriver->GetDataBlocks(lDeviceHandle, 
																		&vDBHandlesHolder, 
																		&vDBNamesHolder, 
																		&lNumDataBlocks);
						if (FAILED(hr))
						{
							goto Error;
						}

						// Loop through the datablocks in search of a specific name.
						//
						for (long k = 0; k < lNumDataBlocks; k++)
						{
							if (SUCCEEDED(hr = SafeArrayGetElement(vDBHandlesHolder.parray,
													   &k, &vDBHandles)))
							{
								if (SUCCEEDED(hr = SafeArrayGetElement(vDBNamesHolder.parray,
													   &k, &vDBNames)))
								{
									szTempName = vDBNames.bstrVal;
									if (szTempName == szObjectName)
									{
										// We found it!
										lObjectHandle = vDBHandles.lVal;

										VariantClear(&vChanHandlesHolder);
										VariantClear(&vChanNamesHolder);
										VariantClear(&vChanHandles);
										VariantClear(&vDevHandlesHolder);
										VariantClear(&vDevNamesHolder);
										VariantClear(&vDevHandles);
										VariantClear(&vDevNames);
										VariantClear(&vDBHandlesHolder);
										VariantClear(&vDBNamesHolder);
										VariantClear(&vDBHandles);
										VariantClear(&vDBNames);
										return S_OK;
									}
								}
								else
								{
									goto Error;
								}
							}
							else
							{
								goto Error;
							}
						}
					}
					else
					{
						if (SUCCEEDED(hr = SafeArrayGetElement(vDevNamesHolder.parray,
													   &j, &vDevNames)))
						{
							szTempName = vDevNames.bstrVal;
							if (szTempName == szObjectName)
							{
								// We found it!
								lObjectHandle = vDevHandles.lVal;

								VariantClear(&vChanHandlesHolder);
								VariantClear(&vChanNamesHolder);
								VariantClear(&vChanHandles);
								VariantClear(&vDevHandlesHolder);
								VariantClear(&vDevNamesHolder);
								VariantClear(&vDevHandles);
								VariantClear(&vDevNames);
								VariantClear(&vDBHandlesHolder);
								VariantClear(&vDBNamesHolder);
								VariantClear(&vDBHandles);
								VariantClear(&vDBNames);
								return S_OK;
							}
						}
						else
						{
							goto Error;
						}
					}
				}
				else
				{
					goto Error;
				}

				// Reinitialize the variants for the next pass
				//
				VariantClear(&vDevNames);
				VariantClear(&vDevHandles);
			
			}	// END for (long j = 0; j < lNumDevices; j++)
		}
		else
		{
			goto Error;
		}

		// Reinitialize the variants for the next pass
		//
		VariantClear(&vChanHandles);

	}	// END for (long i = 0; i < lNumChannels; i++)

Error:
	// Clear the variant data and return failure
	//
	VariantClear(&vChanHandlesHolder);
	VariantClear(&vChanNamesHolder);
	VariantClear(&vChanHandles);
	VariantClear(&vDevHandlesHolder);
	VariantClear(&vDevNamesHolder);
	VariantClear(&vDevHandles);
	VariantClear(&vDevNames);
	VariantClear(&vDBHandlesHolder);
	VariantClear(&vDBNamesHolder);
	VariantClear(&vDBHandles);
	VariantClear(&vDBNames);

	return E_FAIL;
}


////////////////////////////////////////////////////////////////
// CImpIOPCBrowseServer::GetFilter()
//
// @desc Accepts a filter string and determines the filter type from
//		 that string. Also removes the wildcards from the filter string
//
// @parm	CString &		| szFilter		| Returned filter string
// @parm	FILTERTYPE &	| dwFilterType	| Returned filter type
//
// @retval	S_OK	if filtering is to be done.
// @retval	S_FALSE if no filtering is to be done.
//
////////////////////////////////////////////////////////////////
HRESULT	CImpIOPCBrowseServer::GetFilter(CString			&szFilter,		/* IN OUT */
										FILTERTYPE		&dwFilterType)	/* OUT */
{
	int	nIndex	= 0,
		nLength	= szFilter.GetLength();


	// If the filter string is empty, then there is no filtering to be done.
	//
	if (0 == nLength)
	{
		dwFilterType = FILTER_NONE;
		return S_FALSE;
	}

	// Get where the wildcard was found in the filter string.
	//
	nIndex = szFilter.FindOneOf("*");

	if (nIndex != -1)
	{
		// We found one
		if ("*" == szFilter)
		{
			dwFilterType = FILTER_NONE;
			szFilter.Empty();
			return S_FALSE;
		}
		if ((0 == nIndex) && ('*' == szFilter.GetAt(nLength-1)))
		{
			dwFilterType = FILTER_BOTHENDS;
			szFilter = szFilter.Left(nLength - 1);
			szFilter = szFilter.Mid(1);
			return S_OK;
		}
		if (0 == nIndex)
		{
			dwFilterType = FILTER_START;
			szFilter = szFilter.Mid(1);
			return S_OK;
		}
		if ((nLength - 1) == nIndex)
		{
			dwFilterType = FILTER_END;
			szFilter = szFilter.Left(nLength - 1);
			return S_OK;
		}
		
		dwFilterType = FILTER_NONE;
		szFilter.Empty();
		return S_FALSE;
	}

	// Well, the filter string isn't empty and it doesn't contain any
	// wildcards, so they must only want to find a string that is
	// equal to the filter string.
	//
	dwFilterType = FILTER_EQUAL;
	return S_OK;
}


////////////////////////////////////////////////////////////////
// CImpIOPCBrowseServer::FilterString()
//
// @desc Accepts a filter criteria string, filter type and a string 
//			to be filtered. If the string matches the filtering type and 
//			criteria, the function returns TRUE.
//
// @parm	CString		| strString		| String to test against filter
// @parm	CString		| szFilter		| Filter string/criteria
// @parm	FILTERTYPE	| dwFilterType	| Filter type
//
// @retval	TRUE	if the string matches the filter criteria
// @retval	FALSE	if the string does not match the filter criteria.
//
////////////////////////////////////////////////////////////////
BOOL CImpIOPCBrowseServer::FilterString(CString			strString,		/* IN */
										CString			szFilter,		/* IN */
										FILTERTYPE		dwFilterType)	/* IN */
{
	int		nLengthFilter	= szFilter.GetLength(),
			nLengthString	= strString.GetLength(),
			nIndex			= 0;


	// Return TRUE if we are not doing any filtering because all strings
	// will match for that condition
	//
	if (FILTER_NONE == dwFilterType)
	{
		return TRUE;
	}

	// If the length of the filter string is greater than the length of the
	// string to be matched on, then it can never match the criteria.
	// Example:
	//		Filter string = "Device11"
	//		Match string = "Dev"
	// Well, we are trying to find "Device11" inside of the "Dev" string, it
	// simply won't happen. The Match string needs to be larger than the filter
	// string.
	//
	if (nLengthFilter > nLengthString)
	{
		return FALSE;
	}

	switch(dwFilterType)
	{
	case FILTER_START:		// ex. "*ice"
		strString = strString.Mid(nLengthString - nLengthFilter);
		if (strString == szFilter)
		{
			return TRUE;
		}
		break;

	case FILTER_END:		// ex. "dev*"
		nIndex = strString.Find(szFilter);
		if (0 == nIndex)
		{
			return TRUE;
		}
		break;

	case FILTER_BOTHENDS:	// ex. "*ic*"
		if (-1 != strString.Find(szFilter))
		{
			return TRUE;
		}
		break;

	case FILTER_EQUAL:
		if (strString == szFilter)
		{
			return TRUE;
		}
		break;

	case FILTER_NONE:
		return TRUE;
		break;

	default:
		return FALSE;
		break;
	}

	return FALSE;
}


////////////////////////////////////////////////////////////////
// CreateEmptyStringEnumerator()
//
// @desc	Creates and empty IEnumString implementation object. This is
//			used when BrowseOPCItemIDs() returns S_FALSE because there is
//			nothing to enumerate.
//
// @parm	[in] IEnumString **	| ppEnumString | Returned enumerator
// 
// @retval	S_FALSE			success
// @retval	E_OUTOFMEMORY	The new operator failed
// @retval	E_FAIL			failure
//
////////////////////////////////////////////////////////////////
HRESULT CreateEmptyStringEnumerator(IEnumString		**ppEnumString)
{
	IEnumString		*pEnum;


	// Create an empty enumerator
	//
	pEnum = new CImpIEnumString(NULL,			// Parent
								(ULONG)0,		// # strings in enum
								NULL,			// Enum string array
								pIMalloc);		// IMalloc pointer
	if (NULL == pEnum)
	{
		*ppEnumString = NULL;
		return E_OUTOFMEMORY;
	}
	pEnum->AddRef();

	// Call QueryInterface() to get an interface pointer for the client.
	//
	if (FAILED(pEnum->QueryInterface(IID_IEnumString, (LPVOID *)ppEnumString)))
	{
		pEnum->Release();
		*ppEnumString = NULL;
		return E_FAIL;
	}

	// Reset the new enumerator and release our copy of it
	//
	(*ppEnumString)->Reset();
	pEnum->Release();
	return S_FALSE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕av资源一区| 波多野结衣一区二区三区| 久久嫩草精品久久久久| 久久在线观看免费| 中文字幕综合网| 日本中文字幕一区| 福利一区二区在线| 欧美日韩国产电影| 久久久久久久久久久黄色| 一区精品在线播放| 精品无码三级在线观看视频| 99久久精品一区| 26uuu久久天堂性欧美| 中文字幕日本乱码精品影院| 亚洲一区二区三区不卡国产欧美| 日本亚洲最大的色成网站www| 国产成人精品影视| 欧美麻豆精品久久久久久| 国产网红主播福利一区二区| 亚洲制服丝袜在线| 99国产欧美另类久久久精品| 日韩你懂的在线观看| 亚洲一区二区免费视频| 高清beeg欧美| 久久久久久免费毛片精品| 天天色天天爱天天射综合| 在线精品视频一区二区| 国产欧美精品国产国产专区| 日韩不卡一区二区三区 | 欧美精品三级在线观看| 国产欧美一区二区三区网站| 天天免费综合色| 91精品中文字幕一区二区三区| 亚洲图片欧美激情| 色婷婷国产精品综合在线观看| 中文字幕欧美国产| 国产老妇另类xxxxx| 精品第一国产综合精品aⅴ| 国产在线不卡一卡二卡三卡四卡| 欧美一级精品在线| 久久疯狂做爰流白浆xx| 91精品国产综合久久精品app| 午夜亚洲福利老司机| 欧美福利视频导航| 久久97超碰色| 欧美高清在线一区| 日本韩国欧美一区| 天天操天天综合网| 精品成人一区二区三区四区| 国产一区在线视频| 亚洲欧美日韩一区二区三区在线观看 | 日韩无一区二区| 国产一区二区三区黄视频 | 亚洲福利电影网| 日韩欧美中文一区| 成人开心网精品视频| 亚洲最色的网站| 欧美一区二区三区视频在线观看| 国产一区高清在线| 亚洲欧美一区二区不卡| 91精品国产91综合久久蜜臀| 久久99久久久久久久久久久| 久久久不卡网国产精品一区| 91看片淫黄大片一级| 日本不卡123| 亚洲免费观看视频| 精品国产伦一区二区三区观看方式 | 精品在线免费观看| 亚洲三级免费观看| 久久亚洲一级片| 欧美性色黄大片手机版| 国产乱人伦偷精品视频不卡| 18欧美乱大交hd1984| 69久久99精品久久久久婷婷| 国产乱子轮精品视频| 午夜影院久久久| 日韩美女视频19| 日本一区二区在线不卡| 91精品国产免费| 欧美在线观看一区| 91理论电影在线观看| 国产成人在线视频网站| 久久精品国产精品亚洲红杏| 亚洲一区二区五区| 亚洲色图清纯唯美| 中文字幕免费不卡在线| 久久五月婷婷丁香社区| 精品国产凹凸成av人导航| 日韩国产欧美在线观看| 久久久午夜电影| 欧美日韩国产首页| 欧美精品免费视频| 欧美日韩日本视频| 欧美日韩激情一区二区| 欧美视频在线不卡| 欧美日韩激情一区二区| 在线观看视频91| 欧美性色欧美a在线播放| 欧美性xxxxxx少妇| 欧美猛男gaygay网站| 欧美日韩国产一区| 欧美一区二区三区视频免费播放| 欧美日韩中文一区| 日韩午夜中文字幕| 国产视频亚洲色图| 亚洲视频在线一区二区| 亚洲综合999| 日本aⅴ精品一区二区三区| 亚洲人午夜精品天堂一二香蕉| 欧美成人a视频| 欧洲在线/亚洲| 日韩一级高清毛片| 久久久久高清精品| 综合av第一页| 日产欧产美韩系列久久99| 秋霞午夜鲁丝一区二区老狼| 久久99精品久久久| 99久久久国产精品| 欧美成人三级电影在线| 久久女同互慰一区二区三区| 久久精品视频一区| 亚洲成人综合视频| 国产又黄又大久久| 欧美欧美欧美欧美首页| 久久精品视频在线免费观看 | 欧美一级视频精品观看| 久久九九99视频| 99久久精品久久久久久清纯| 欧美日韩精品系列| 综合色中文字幕| 蜜桃精品在线观看| 在线观看欧美黄色| 国产精品国产馆在线真实露脸 | 亚洲1区2区3区4区| 国产91露脸合集magnet| 91精品婷婷国产综合久久竹菊| 国产精品毛片久久久久久| 久久精品99国产精品| 欧美日韩国产片| 一区二区三区四区在线免费观看| 国产iv一区二区三区| 欧美r级在线观看| 麻豆91小视频| 精品欧美久久久| 美女网站色91| 日韩欧美自拍偷拍| 捆绑调教一区二区三区| 91精品国产色综合久久ai换脸| 亚洲美女屁股眼交| 欧美视频在线播放| 亚洲精品第一国产综合野| 99re免费视频精品全部| 亚洲欧洲成人精品av97| av激情亚洲男人天堂| 中文一区一区三区高中清不卡| 国产成人午夜精品影院观看视频| 精品国产sm最大网站| 国产中文字幕精品| 中文字幕的久久| 91免费国产在线观看| 亚洲综合偷拍欧美一区色| 欧美三日本三级三级在线播放| 亚洲午夜一二三区视频| 91麻豆精品国产91久久久| 捆绑调教一区二区三区| 国产精品网站一区| av一区二区三区四区| 亚洲国产日韩精品| 欧美电影免费观看高清完整版| 九色综合狠狠综合久久| 国产亚洲人成网站| 91久久精品午夜一区二区| 午夜欧美一区二区三区在线播放| 91精品一区二区三区久久久久久| 久久99精品久久只有精品| 亚洲色图色小说| 久久综合网色—综合色88| 91啪九色porn原创视频在线观看| 亚洲一区二区三区四区五区黄 | 日韩三级伦理片妻子的秘密按摩| 国产一区二区三区美女| 一区二区三区在线看| 精品国产百合女同互慰| 一本一道久久a久久精品| 日产国产高清一区二区三区 | 欧洲一区二区av| 国产jizzjizz一区二区| 青青草一区二区三区| 亚洲精品乱码久久久久久黑人| 久久久午夜电影| 5566中文字幕一区二区电影| 91色porny蝌蚪| 国产精品一区2区| 美国三级日本三级久久99| 亚洲在线成人精品| 亚洲另类在线制服丝袜| 中文字幕亚洲精品在线观看| 精品国产电影一区二区| 日韩一二三四区| 欧美日韩日日夜夜|