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

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

?? impiopcserver.cpp

?? 基于Intellution開發包的開發的OPC服務器
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
STDMETHODIMP CImpIOPCServer::AddGroup(LPCWSTR		szName, 
									  BOOL			bActive, 
									  DWORD			dwRequestedUpdateRate, 
									  OPCHANDLE		hClientGroup,
									  LONG			*pTimeBias, 
									  FLOAT			*pPercentDeadband, 
									  DWORD			dwLCID, 
									  OPCHANDLE		*phServerGroup,
									  DWORD			*pRevisedUpdateRate, 
									  REFIID		riid, 
									  LPUNKNOWN		*ppUnk)
{
	OPCHANDLE		OPCHandle;
	COPCDrvGroup	*pNewGroup	= NULL;
	HRESULT			hr;


	// Make sure that we didn't get any bad pointers
	//
	if ((NULL == szName) ||
		(NULL == ppUnk)  ||
		(NULL == phServerGroup))
	{
		return E_INVALIDARG;
	}

	// Default return in case of error
	//
	*ppUnk = NULL;

	// Generate Unique Name (WCHAR) if not supplied by caller.
	//	
	if (NULL == *szName)
	{
		CString		strGeneratedName;
		DWORD		dwNumGroups			= m_pParentServer->GetNumGroupHandles(),
					i					= 1;
		char		szNumGroups[15],
					*pszGeneratedName	= NULL;
		int			nLength				= 0;
		LPUNKNOWN	lpTest				= NULL;

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

		// We will try NumGroups + 1 different names. We SHOULD find one 
		// that isn't already configured.
		//
		while(i <= (dwNumGroups + 1))
		{
			strGeneratedName = g_strDefaultGeneratedGroupName;
			ltoa((dwNumGroups + i), szNumGroups, 10);
			strGeneratedName += szNumGroups;
			nLength	= strGeneratedName.GetLength();

			pszGeneratedName = strGeneratedName.GetBuffer(nLength+1);
			szName = A2W(pszGeneratedName);
			strGeneratedName.ReleaseBuffer();

			GetGroupByName(szName, IID_IUnknown, &lpTest);
			if(NULL == lpTest)
			{
				break;
			}
			i++;
		}
	}

	// Verify that the name provided is Unique
	//
	LPUNKNOWN	lpTest;
	GetGroupByName(szName, IID_IUnknown, &lpTest);
	if(lpTest)
	{
		lpTest->Release();
		return OPC_E_DUPLICATENAME;
	}

	// Create the new group and record our reference to it.
	//
	hr = m_pParentServer->GroupAlloc(&OPCHandle, &pNewGroup, this->m_pUnkOuter);
	if (FAILED(hr))
	{
		return E_OUTOFMEMORY;
	}
	pNewGroup->AddRef();

	// And request a 2nd interface for the caller
	//
	hr = pNewGroup->QueryInterface(riid, (LPVOID *)ppUnk);
	if(FAILED(hr))
	{
		// If error - delete group and return
		delete pNewGroup;
		return E_FAIL;
	}

	// Copy the data to the new group
	//
	pNewGroup->m_ServerGroupHandle	= OPCHandle;
	pNewGroup->m_szName				= WSTRClone(szName, NULL);
	pNewGroup->m_ClientGroupHandle	= hClientGroup;
	pNewGroup->m_LCID				= dwLCID;
	pNewGroup->SetActive(bActive);
	pNewGroup->SetUpdateRate(dwRequestedUpdateRate, pRevisedUpdateRate);
	if (pPercentDeadband)
	{
		pNewGroup->m_Deadband = *pPercentDeadband;
	}
	if(pTimeBias) 
	{
		pNewGroup->m_TimeBias = *pTimeBias;
	}

	// Add the new group to the map
	//
	m_pParentServer->GroupSet(pNewGroup);

	// Return handle of the new group to the caller
	//
	*phServerGroup = OPCHandle;

	// We now have a group in the server, so change the status to active
	//
	m_pParentServer->m_ServerState = OPC_STATUS_RUNNING;

	return S_OK;
}


////////////////////////////////////////////////////////////////
// CImpIOPCServer::GetGroupByName()
//
// This function scans the set of groups known to this OPC 
// server and returns a pointer to the IOPCGroup interface for 
// the specified group.
//
// Returns:
//	HRESULT	-	S_OK if the function succeeded
//			-	E_FAIL if the function failed. This will happen
//				if the name passed to us was not found in
//				the map.	
//
////////////////////////////////////////////////////////////////
STDMETHODIMP CImpIOPCServer::GetGroupByName(LPCWSTR		szGroupName, 
											REFIID		riid, 
											LPUNKNOWN	*ppUnk)
{
	HRESULT			hr;
	OPCHANDLE		OPCHandle	= 0;
	COPCDrvGroup	*pGroup		= NULL;
	POSITION		posGroup	= m_pParentServer->GetFirstGroupPosition();
	int				nNumGroups	= m_pParentServer->GetNumGroupHandles();


	*ppUnk = 0;

	// Loop on the number of groups in the server until the name we are
	// looking for is found. If we don't find it, we will return E_FAIL.
	//
	for (int i = 0; i < nNumGroups; i++)
	{
		m_pParentServer->GetNextGroup(posGroup, OPCHandle, pGroup);

		if (!wcscmp(pGroup->m_szName, szGroupName))
		{
			// Then query for and return the requested interface
			//
			hr = pGroup->QueryInterface(riid, (LPVOID *)ppUnk);
			if(FAILED(hr))
			{
				// If error - return
				return E_FAIL;
			}
			return S_OK;
		}
	}

	return E_FAIL;
}


////////////////////////////////////////////////////////////////
// CImpIOPCServer::RemoveGroup()
//
// This function removes the specified group from the server.  
// Note that the group doesn't go away until the last reference
// to it is removed.
//
// Returns:
//	HRESULT	-	S_OK if the function succeeded
//			-	E_FAIL if the function failed. This will happen
//				if the handle passed to us was not found in
//				the map.
//
////////////////////////////////////////////////////////////////
STDMETHODIMP CImpIOPCServer::RemoveGroup(OPCHANDLE	OPCHandle, 
										 BOOL		bForce)
{
	COPCDrvGroup	*pGroup	= NULL;


	// Lock the parent server object
	//
	m_pParentServer->Lock();

	// Make sure the passed ServerHandle is valid
	//
	if (FALSE == m_pParentServer->IsGroupValid(OPCHandle))
	{
		return E_FAIL;
	}

	// Remove it from the map. (This will perform a Release().)
	//
	m_pParentServer->GroupFree(OPCHandle, bForce);

	// If we have deleted the last groups in the server, then change the status to
	// not configured.
	//
	if (0 == m_pParentServer->GetNumGroupHandles())
	{
		m_pParentServer->m_ServerState = OPC_STATUS_NOCONFIG;
	}

	// Unlock the parent server
	//
	m_pParentServer->UnLock();
	return S_OK;
}


////////////////////////////////////////////////////////////////
// CImpIOPCServer::CreateGroupEnumerator()
//
// This function creates a string enumerator containing the
// group names for the server.
//
// Returns:
//	HRESULT	-	S_OK if the function succeeded.
//			-	E_FAIL if the function failed.
//			-	E_OUTOFMEMORY if a memory allocator failed.
//			-	S_FALSE if there is nothing to enumerate (in
//				the case that there are no groups).
//			-	E_INVALIDARG if a passed parameter is invalid.
//
////////////////////////////////////////////////////////////////
STDMETHODIMP CImpIOPCServer::CreateGroupEnumerator(OPCENUMSCOPE		dwScope, 
												   REFIID			riid,
												   LPUNKNOWN		*ppUnk)
{
	if (NULL == ppUnk)
	{
		return E_INVALIDARG;
	}

	if (riid == IID_IEnumUnknown)
	{
		// Note this logic is also used in XXXServer::QueryInterface
		CImpIEnumUnknown	*pEnumUnknown;
		LPUNKNOWN			*pGroupList;
		int					nGroupCount;
		HRESULT				hr;


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

		// Informthe caller if there is nothing to enumerate
		//
		if (0 == nGroupCount)
		{
			*ppUnk = NULL;
			return S_FALSE;
		}

		// Create the Enumerator using the snapshot
		// Note that the enumerator will AddRef the server 
		// and also all of the groups.
		//
		pEnumUnknown = new CImpIEnumUnknown(m_pUnkOuter, nGroupCount, pGroupList, pIMalloc);
		m_pParentServer->FreeUnkList(pGroupList, nGroupCount);

		if (pEnumUnknown == NULL)
		{
			*ppUnk = NULL;
			return E_OUTOFMEMORY;
		}

		// Then QI for the interface ('pEnumString') 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 = pEnumUnknown->QueryInterface(riid, (LPVOID *)ppUnk);
		if (FAILED(hr))
		{
			*ppUnk = NULL;
			delete pEnumUnknown;
			return E_FAIL;
		}

		return S_OK;
	}
	else if (riid == IID_IEnumString)
	{
		CImpIEnumString		*pEnumString;
		LPOLESTR			*pGroupList;
		int					nGroupCount;
		HRESULT				hr;


		// Get a snapshot of the group list 
		//
		m_pParentServer->GetNameList(dwScope, &pGroupList, &nGroupCount);

		// Informthe caller if there is nothing to enumerate
		//
		if (0 == nGroupCount)
		{
			*ppUnk = NULL;
			return S_FALSE;
		}

		// Create the Enumerator using the snapshot
		// Note that the enumerator will AddRef the server 
		//
		pEnumString = new CImpIEnumString(m_pUnkOuter, nGroupCount, pGroupList, pIMalloc);
		m_pParentServer->FreeNameList(pGroupList, nGroupCount);

		if (pEnumString == NULL)
		{
			*ppUnk = NULL;
			return E_OUTOFMEMORY;
		}

		// Then QI for the interface ('pEnumString') 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 = pEnumString->QueryInterface(riid, (LPVOID *)ppUnk);
		if (FAILED(hr))
		{
			*ppUnk = NULL;
			delete pEnumString;
			return E_FAIL;
		}

		return S_OK;
	}

	// Unknow refiid, so return an error
	//
	*ppUnk = NULL;
	return E_INVALIDARG;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲人成网站影音先锋播放| 成人一区二区三区在线观看| 九九**精品视频免费播放| 国产精品一二三四| 欧美日韩国产精品成人| 日本一区免费视频| 麻豆精品久久精品色综合| 不卡影院免费观看| 欧美v亚洲v综合ⅴ国产v| 亚洲电影在线播放| 成人三级伦理片| 欧美videossexotv100| 亚洲一区二区在线免费看| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 精品一区二区影视| 欧美日韩一卡二卡三卡| 亚洲欧洲无码一区二区三区| 韩国精品一区二区| 日韩精品一区二区三区swag| 亚洲精品一二三四区| 成人av免费在线播放| 日本一区二区三区国色天香| 国产原创一区二区三区| 欧美一区二区三区四区五区| 亚洲成a人在线观看| 在线观看91精品国产入口| 国产精品久久久久久户外露出 | 26uuu欧美日本| 午夜精品福利一区二区蜜股av | 国产精品自拍av| 日韩精品一区二区三区中文精品| 亚洲bdsm女犯bdsm网站| 91久久精品网| 亚洲一区二三区| 欧美无乱码久久久免费午夜一区| 综合色中文字幕| 不卡视频免费播放| 亚洲女与黑人做爰| 欧美在线|欧美| 午夜一区二区三区视频| 欧美三级日韩在线| 日本va欧美va瓶| 精品99999| 99久久精品99国产精品| 亚洲欧美日韩在线不卡| 欧美日韩三级一区二区| 日日摸夜夜添夜夜添精品视频| 欧美一级免费大片| 国内精品视频666| 国产精品毛片a∨一区二区三区| av一区二区久久| 亚洲成a人片在线观看中文| 欧美精品日韩一本| 久久97超碰色| 亚洲人成人一区二区在线观看| 91免费观看国产| 午夜日韩在线电影| 久久精品夜色噜噜亚洲a∨ | 国产福利91精品| 亚洲男人的天堂av| 欧美老肥妇做.爰bbww| 久久精品国产第一区二区三区| 欧美国产97人人爽人人喊| 色综合久久久网| 蓝色福利精品导航| 国产蜜臀av在线一区二区三区| 日本韩国欧美国产| 美女一区二区久久| 成人欧美一区二区三区| 欧美日韩日日骚| 成人一区二区三区在线观看| 午夜电影一区二区三区| 国产精品色哟哟网站| 欧美精品高清视频| 91碰在线视频| 国产一区二区三区av电影| 一区二区三区四区蜜桃| 久久久久久久久99精品| 在线免费观看成人短视频| 国产麻豆9l精品三级站| 亚洲电影在线播放| 国产精品入口麻豆九色| 日韩美女在线视频| 欧美日韩aaa| 91福利精品视频| 国产精品亚洲第一| 毛片一区二区三区| 亚洲国产欧美在线人成| 国产精品乱人伦中文| 精品黑人一区二区三区久久| 欧美性受xxxx黑人xyx性爽| 成人激情免费电影网址| 国精产品一区一区三区mba桃花 | 国产精品资源在线看| 五月婷婷欧美视频| 亚洲综合色视频| 国产精品国产三级国产有无不卡| 欧美电视剧在线看免费| 欧美区一区二区三区| 91丨九色丨黑人外教| 国产宾馆实践打屁股91| 国产一区二区三区黄视频| 婷婷成人综合网| 午夜电影久久久| 亚洲一区av在线| 一区二区久久久| 一区二区三区精品| 亚洲精品乱码久久久久久日本蜜臀| 欧美国产日产图区| 久久精品在线观看| 国产欧美一区视频| 中文字幕免费一区| 中文字幕av不卡| 国产欧美日韩视频在线观看| 精品粉嫩超白一线天av| 337p日本欧洲亚洲大胆精品| 精品成人在线观看| 久久亚洲一区二区三区明星换脸 | 国产精品电影一区二区| 国产精品你懂的在线| 中文字幕第一区综合| 中文字幕日韩欧美一区二区三区| 国产精品久久久久精k8| 亚洲欧美日韩小说| 亚洲观看高清完整版在线观看| 亚洲国产精品欧美一二99| 国产一区二区导航在线播放| 精品无人码麻豆乱码1区2区| 国产一区在线精品| 成人动漫一区二区| 在线观看中文字幕不卡| 7777精品伊人久久久大香线蕉完整版 | 国产精品亚洲一区二区三区妖精 | 亚洲制服丝袜av| 午夜免费久久看| 久久国产剧场电影| 国产激情一区二区三区四区| 成人aa视频在线观看| 欧美色男人天堂| 精品免费日韩av| 日本一区二区高清| 亚洲va国产天堂va久久en| 久久国产人妖系列| 99免费精品在线| 欧美一区二区三区影视| 国产欧美一区二区精品性| 一区二区三区四区视频精品免费| 日本欧美一区二区三区| 成人午夜在线视频| 538prom精品视频线放| 久久日韩精品一区二区五区| 亚洲婷婷综合色高清在线| 日韩电影在线一区二区三区| 国产一区二区在线影院| 欧洲视频一区二区| 国产调教视频一区| 首页欧美精品中文字幕| 成人免费毛片aaaaa**| 88在线观看91蜜桃国自产| 国产精品女同互慰在线看| 免费人成黄页网站在线一区二区| 成人午夜精品一区二区三区| 欧美军同video69gay| 国产精品的网站| 国产自产视频一区二区三区| 色婷婷av一区| 国产丝袜欧美中文另类| 日本一不卡视频| 91黄色在线观看| 中文字幕亚洲一区二区va在线| 日本不卡高清视频| 91视频国产观看| 国产欧美精品一区二区色综合朱莉| 亚洲福利一区二区| 日本电影亚洲天堂一区| 国产午夜精品美女毛片视频| 天天综合网 天天综合色| 99re8在线精品视频免费播放| 精品国产乱码久久久久久免费| 一区二区在线免费| 成人动漫视频在线| 久久免费精品国产久精品久久久久| 日韩精品国产欧美| 精品视频一区二区三区免费| 亚洲欧美一区二区视频| 国产成人夜色高潮福利影视| 欧美成人免费网站| 日本va欧美va瓶| 3d动漫精品啪啪一区二区竹菊| 亚洲一二三四在线| 在线精品视频一区二区三四 | 91久久精品一区二区三区| 国产欧美日韩卡一| jizz一区二区| 综合久久给合久久狠狠狠97色| 成人毛片老司机大片| 中文字幕成人网| 99久久久久久99| 亚洲免费观看高清完整版在线观看| 成人的网站免费观看|