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

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

?? opcserver.cpp

?? opc的客戶端程序,在csdn上下的,不過我想看看這里下的詳細(xì)說明
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
#include "stdafx.h"
#include "opcserver.h"
#include "opcclientdoc.h"

//#define FULL_TEST

extern OPCClientDoc* theDoc;
// The OPC data formats
UINT OPCSTMFORMATDATA = RegisterClipboardFormat(_T("OPCSTMFORMATDATA"));
UINT OPCSTMFORMATDATATIME = RegisterClipboardFormat(_T("OPCSTMFORMATDATATIME"));
UINT OPCSTMFORMATWRITECOMPLETE = RegisterClipboardFormat(_T("OPCSTMFORMATWRITECOMPLETE"));

IMPLEMENT_SERIAL(Item, CObject,0)
IMPLEMENT_SERIAL(COPCGroup, CObject, 0)
IMPLEMENT_SERIAL(COPCServer, CObject, 0)

//************************************************************
//************************************************************
//************************************************************
//class Item

void Item::Serialize(CArchive& ar)
{
	if(ar.IsStoring())
	{
		ar<<name;		//名稱
		ar<<access_path;	//訪問路徑
		ar<<description;
	}
	else
	{
		ar>>name;
		ar>>access_path;
		ar>>description;
	}
}
//************************************************************
//默認(rèn)構(gòu)造函數(shù)
COPCGroup::COPCGroup(COPCServer* server)
	:group_name(_T("Group1")), 
	update_rate(1000),
	dead_band(0.0),
	time_bias(0),
	active(false),
	local_id(0),
	group_handle(0),
	parent(server)
{
	connection1 = 0;
	connection2 = 0;
	call_back_connection = 0;
	use_cp = false;
	
	tree_item = 0;

	advise_sink = new CAdviseSink;
	ASSERT(advise_sink);
	advise_sink->AddRef();
	
	call_back = new OPCCallbackObject;
	call_back->AddRef();

	current_item = NULL;
	while(!items.IsEmpty())
		delete items.RemoveHead();
}

//拷貝構(gòu)造函數(shù)
COPCGroup::COPCGroup(COPCServer* server, COPCGroup& group)
{
	group_name = group.get_name();
	update_rate = group.get_update_rate();
	dead_band = group.get_dead_band();
	time_bias = group.get_time_bias();
	active = group.get_active();
	local_id = group.get_local_id();
	group_handle = 0;
	
	parent = group.parent;
	tree_item = 0;

	connection1 = 0;
	connection2 = 0;
	call_back_connection = 0;
	use_cp = false;
	
	advise_sink = new CAdviseSink;
	ASSERT(advise_sink);
	advise_sink->AddRef();
	
	call_back = new OPCCallbackObject;
	call_back->AddRef();
	
	current_item = NULL;
	while(!items.IsEmpty())
		delete items.RemoveHead();
	
	ItemList& item_list = group.get_items();
	POSITION item_pos = item_list.GetHeadPosition();
	while(item_pos){
		Item* item = item_list.GetNext(item_pos);
		Item* new_item = new Item;
		
		if(!new_item || !item)
			continue;
		
		CoFileTimeNow(&new_item->timestamp);
		new_item->name = item->name;
		new_item->access_path = item->access_path;
		new_item->description = item->description;
		new_item->hServerHandle = item->hServerHandle;
		new_item->quality = item->quality;
		new_item->access_rights = item->access_rights;
		new_item->active = item->active;
		new_item->native_type = item->native_type;
		new_item->value = item->value;
		new_item->server = parent;
		new_item->group = this;
		
		items.AddTail(new_item);
	}
}

COPCGroup::~COPCGroup(){

	//刪除每個點
	HRESULT hr = S_OK;
	if(opc_group.IsOk()){
		if(use_cp)
			hr = AtlUnadvise(opc_group, IID_IOPCDataCallback, call_back_connection);
		else{
			DataObject data_object;
			hr = data_object.Attach(opc_group);
			if(SUCCEEDED(hr)){
				if(connection1)
					hr = data_object.DUnadvise(connection1);
				if(connection2)
					hr = data_object.DUnadvise(connection2);

				data_object.Detach();
			}
		}
		
		int count = items.GetCount();
		if(count > 0){
			OPCItemMgt item_mgt;
			hr = item_mgt.Attach(opc_group);
			if(SUCCEEDED(hr)){
				HRESULT* errors = NULL;
				OPCHANDLE* handles = new OPCHANDLE[count];
				ASSERT(handles);

				POSITION item_pos = items.GetHeadPosition();
				for(int index = 0; item_pos; index++){
					Item* item = items.GetNext(item_pos);
					ASSERT(item);

					handles[index] = item->hServerHandle;
				}
				hr = item_mgt.RemoveItems(count, handles, &errors);
				if(SUCCEEDED(hr))
					CoTaskMemFree(errors);

				delete[] handles;

				item_mgt.Detach();
			}
		}
	}	
	if(parent && parent->is_connected()){
		hr = parent->opc_server.RemoveGroup(group_handle, FALSE);
		if(FAILED(hr))
			theDoc->ReportError(_T("Remove Group Failed: "), hr);
	}
		

	current_item = NULL;
	while(!items.IsEmpty())
		delete items.RemoveHead();

	call_back->Release();
	advise_sink->Release();

	opc_group.Detach();
}

void COPCGroup::Serialize(CArchive& ar){
	if(ar.IsStoring()){
		ar << group_name;
		ar << update_rate;
		ar << dead_band;
		ar << time_bias;
		ar << local_id;
		ar << active;

		int item_count = items.GetCount();
		ar << item_count;
		POSITION item_pos = items.GetHeadPosition();
		while(item_pos){
			Item* item = items.GetNext(item_pos);
			if(item)
				item->Serialize(ar);
		}
	}
	else{
		ar >> group_name;
		ar >> update_rate;
		ar >> dead_band;
		ar >> time_bias;
		ar >> local_id;
		ar >> active;
		
		active = TRUE;

		
		if(parent && parent->is_connected())
			parent->add_group(this);
		else{
			delete this;
			return;
		}

		while(!items.IsEmpty())
			delete items.RemoveHead();

		int item_count = 0;
		ar >> item_count;
		while(item_count --){
			Item* item = new Item;
			if(item){
				item->Serialize(ar);
				item->active = TRUE;

				//items.AddTail(item);
				add_item(item);
			}
		}
	}
}

Item* COPCGroup::add_item(Item *item)
{
	USES_CONVERSION;
	CWaitCursor wait;

	if(!(item && parent)){
		delete item;
		return 0;
	}
	
	OPCItemMgt item_mgt;
	HRESULT hr = item_mgt.Attach(opc_group);
	if(FAILED(hr)){
		delete item;
		return 0;
	}
	
	current_item = item;		//當(dāng)前點

	OPCITEMDEF	item_def;
	item_def.szItemID = T2OLE(item->name.GetBuffer(0));
	item_def.szAccessPath = T2OLE(item->access_path.GetBuffer(0));
	item_def.pBlob = NULL;
	item_def.dwBlobSize = 0;
	item_def.bActive = item->active;
	item_def.hClient = (OPCHANDLE)item;
	item_def.vtRequestedDataType = item->native_type;
	
	//添加點
	OPCITEMRESULT*	results;
	HRESULT*	errors;
	hr = item_mgt.AddItems(1, &item_def, &results, &errors);
	if(FAILED(hr)){
		theDoc->ReportError(_T("Add Items: "), hr);
		delete item;

		return 0;
	}
	item->hServerHandle = results->hServer;
	item->native_type = results->vtCanonicalDataType;
	
	HRESULT item_result = errors[0];
	if(results->pBlob != NULL)
		CoTaskMemFree(results->pBlob);
	
	CoTaskMemFree(results);
	CoTaskMemFree(errors);
	
	if(FAILED(item_result)){
		theDoc->ReportError(_T("Add Items: "), hr);
		delete item;
		return 0;
	}

	items.AddTail(item);		//保存點
	
	//讀取初始值
	OPCSyncIO sync_io;
	hr = sync_io.Attach(opc_group);
	if(SUCCEEDED(hr)){
		OPCITEMSTATE* item_state = NULL;
		hr = sync_io.Read(
			OPC_DS_CACHE,
			1,
			&item->hServerHandle,
			&item_state,
			&errors);
		if(SUCCEEDED(hr)){
			ASSERT(item_state->hClient == (OPCHANDLE)item);
			item->quality = item_state->wQuality;
			item->value = item_state->vDataValue;
			
			VariantClear(&item_state->vDataValue);
			CoTaskMemFree(item_state);
			CoTaskMemFree(errors);
		}
		else{
			theDoc->ReportError(_T("SysncIO Read: "), hr);
			return 0;
		}

		sync_io.Detach();
	}
	
	return item;
}


DWORD COPCGroup::add_items(DWORD item_count, Item *item_arr)
{
	USES_CONVERSION;
	CWaitCursor wait;

	DWORD dwCount = 0;

	for(DWORD i = 0; i < item_count; i++){
		Item* item = item_arr + i;
		
		if(!(item && parent)){
			delete item;
			item = 0;
			continue;
		}
		
		OPCItemMgt item_mgt;
		HRESULT hr = item_mgt.Attach(opc_group);
		if(FAILED(hr)){
			delete item;
			item = 0;
			continue;
		}
		
		current_item = item;		//當(dāng)前點
		
		OPCITEMDEF	item_def;
		item_def.szItemID = T2OLE(item->name.GetBuffer(0));
		item_def.szAccessPath = T2OLE(item->access_path.GetBuffer(0));
		item_def.pBlob = NULL;
		item_def.dwBlobSize = 0;
		item_def.bActive = item->active;
		item_def.hClient = (OPCHANDLE)item;
		item_def.vtRequestedDataType = item->native_type;
		
		//添加點
		OPCITEMRESULT*	results;
		HRESULT*	errors;
		hr = item_mgt.AddItems(1, &item_def, &results, &errors);
		if(FAILED(hr)){
			theDoc->ReportError(_T("Add Items: "), hr);
			delete item;
			item = 0;
			continue;
		}
		item->hServerHandle = results->hServer;
		item->native_type = results->vtCanonicalDataType;
		
		HRESULT item_result = errors[0];
		if(results->pBlob != NULL)
			CoTaskMemFree(results->pBlob);
		
		CoTaskMemFree(results);
		CoTaskMemFree(errors);
		
		if(FAILED(item_result)){
			theDoc->ReportError(_T("Add Items: "), hr);
			delete item;
			item = 0;
			continue;
		}
		
		items.AddTail(item);		//保存點
		
		//讀取初始值
		OPCSyncIO sync_io;
		hr = sync_io.Attach(opc_group);
		if(SUCCEEDED(hr)){
			OPCITEMSTATE* item_state = NULL;
			hr = sync_io.Read(
				OPC_DS_CACHE,
				1,
				&item->hServerHandle,
				&item_state,
				&errors);
			if(SUCCEEDED(hr)){
				ASSERT(item_state->hClient == (OPCHANDLE)item);
				item->quality = item_state->wQuality;
				item->value = item_state->vDataValue;
				
				VariantClear(&item_state->vDataValue);
				CoTaskMemFree(item_state);
				CoTaskMemFree(errors);
			}
			else{
				theDoc->ReportError(_T("SysncIO Read: "), hr);
				continue;
			}
			
			sync_io.Detach();
		}

		dwCount++;
	}

	return dwCount;
}
//****************************************************
COPCServer::COPCServer(){
	current_group = 0;
	server_info = 0;

/*
	shut_down = new OPCShutdownObject;
	shut_down->AddRef();
*/
	shut_down_connection = 0;

	tree_item = 0;
}

COPCServer::~COPCServer(){
	if(is_connected())
		disconnect();
	
	shut_down->Release();

	current_group = NULL;
	while(!groups.IsEmpty())
		delete groups.RemoveHead();

	if(server_info){
		delete server_info;
		server_info = 0;
	}
}


OPCServerInfo* COPCServer::SetServerInfo(OPCServerInfo *info)
{
	if(is_connected()){
		delete info;
		info = 0;
		
		return 0;
	}

	if(info){
		if(server_info)
			delete server_info;

		server_info = info;
	}

	return info;
}

//通用
/*
LPWSTR ConvertMultiByteToWideChar(LPCSTR ttt)
{
	try{
		
		size_t aLen = strlen( ttt ) + 1;
		int wLen = MultiByteToWideChar(
			CP_ACP,
			0,
			ttt,
			aLen,
			NULL,
			0);
		LPOLESTR tempID= new WCHAR [wLen];
		int nreturn=MultiByteToWideChar(CP_ACP,0,ttt,aLen,tempID,wLen);
		return (LPWSTR)tempID;
	}catch(...){
		return L"";
	}
}
*/


extern IOPCServer			*m_pIOPCServer;
extern IOPCItemMgt			*m_pIOPCItemMgt;
extern IOPCGroupStateMgt	*m_pIOPCGroupStateMgt;
extern IOPCAsyncIO2		*m_pIOPCAsyncIO2;
extern OPCITEMRESULT		*m_pItemResult;
extern HRESULT				*m_pErrors;
extern OPCHANDLE			m_GrpSrvHandle;
#include "opctest/callback.h"


//連接OPCServer
bool COPCServer::connect(OPCServerInfo *info)
{
	USES_CONVERSION;

	if(is_connected())
		return true;
	
	CWaitCursor wait_cursor;

	if(info)
		server_info = info;
	else
		info = server_info;
	
	bool use_node = true;
	if(info->m_NodeName.IsEmpty()
		|| _tcsicmp(_T(""), info->m_NodeName) == 0
		|| _tcsicmp(_T("localhost"), info->m_NodeName) == 0
		|| _tcsicmp(_T("127.0.0.1"), info->m_NodeName) ==0 ){
			use_node = false;
		}
	if(use_node){	//是否同為本機(jī)
		TCHAR sz_local_host[MAX_COMPUTERNAME_LENGTH + 1];
		DWORD dw_host_size = sizeof(sz_local_host);
		if(GetComputerName(sz_local_host, &dw_host_size)){
			if(_tcsicmp(sz_local_host, info->m_NodeName) == 0)
				use_node = false;
		}
	}
	
	//建立OPC對象
	HRESULT hr = S_OK;
	LPUNKNOWN punknown = NULL;
	
	if(!use_node){	//本地OPCServer
		hr = CoCreateInstance(
			info->m_clsid,

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久国产人妖系列| 亚洲欧美综合在线精品| 成人小视频免费在线观看| 亚洲视频 欧洲视频| 337p亚洲精品色噜噜狠狠| 国产九色sp调教91| 午夜视频在线观看一区二区| 日本一区二区三区在线不卡 | 99久久精品情趣| 日本欧美久久久久免费播放网| 亚洲国产激情av| 日韩一级大片在线| 欧美日韩视频专区在线播放| 成人高清免费在线播放| 国内精品伊人久久久久av影院| 亚洲精品高清视频在线观看| 国产欧美一区二区精品忘忧草| 欧美一区二区三区爱爱| 91极品美女在线| 不卡的电影网站| 国产成人精品免费一区二区| 丝袜亚洲另类丝袜在线| 夜夜嗨av一区二区三区| 激情欧美一区二区| 91黄色免费看| 国产成人精品综合在线观看| 青青草原综合久久大伊人精品 | 久久久亚洲精品一区二区三区| 欧美日韩在线精品一区二区三区激情| 成人av资源在线观看| 国产呦萝稀缺另类资源| 狠狠色丁香婷婷综合| 日本美女一区二区三区视频| 性欧美疯狂xxxxbbbb| 亚洲一区二区三区在线看| 最新国产成人在线观看| 中文字幕一区二区三区在线观看| 国产午夜精品一区二区三区视频 | 蜜桃视频在线观看一区二区| 亚洲一卡二卡三卡四卡五卡| 一区二区在线观看视频| 亚洲日本一区二区三区| 亚洲欧洲性图库| 51精品国自产在线| 麻豆精品新av中文字幕| 亚洲.国产.中文慕字在线| 亚洲嫩草精品久久| 亚洲精品高清视频在线观看| 亚洲免费观看高清完整版在线观看熊 | 亚洲欧美激情在线| 专区另类欧美日韩| 亚洲人午夜精品天堂一二香蕉| 国产精品理论片在线观看| 国产精品每日更新在线播放网址| 亚洲国产精品精华液ab| 国产精品理伦片| 亚洲综合自拍偷拍| 午夜精品福利久久久| 91视视频在线观看入口直接观看www | 日韩成人一级大片| 青青国产91久久久久久| 激情欧美一区二区三区在线观看| 国产一区二区精品在线观看| 国产不卡视频在线播放| 成人av网站免费| 欧美亚洲国产怡红院影院| 欧美久久久影院| 久久午夜色播影院免费高清 | 日韩免费视频一区| 久久久99久久| 一区二区三区中文字幕精品精品 | 国产成人亚洲精品青草天美| av在线不卡电影| 欧美性做爰猛烈叫床潮| 日韩免费成人网| 国产精品日日摸夜夜摸av| 亚洲成a人片综合在线| 国产最新精品免费| 91免费观看在线| 欧美精品在线视频| 国产欧美日韩麻豆91| 一区二区三区欧美视频| 久热成人在线视频| 91麻豆精品视频| 欧美一级日韩一级| 国产精品久久毛片av大全日韩| 天堂一区二区在线| 成人一区二区视频| 91精品久久久久久久99蜜桃| 中文字幕欧美日本乱码一线二线| 亚洲国产精品久久久男人的天堂| 狠狠色综合日日| 欧美中文字幕一区二区三区亚洲| 精品国产百合女同互慰| 夜夜揉揉日日人人青青一国产精品 | 日韩毛片在线免费观看| 麻豆久久一区二区| 在线免费亚洲电影| 亚洲国产精品ⅴa在线观看| 成人小视频在线观看| 欧美日韩在线一区二区| 国产精品人妖ts系列视频| 奇米一区二区三区av| 色婷婷av一区二区三区大白胸| 精品日韩一区二区三区| 亚洲mv大片欧洲mv大片精品| 99久久综合精品| 久久午夜老司机| 午夜私人影院久久久久| 91丨九色丨国产丨porny| 久久久综合网站| 蜜臀av性久久久久蜜臀aⅴ| 在线免费视频一区二区| 国产精品传媒视频| 国产大陆a不卡| 日韩一级大片在线| 日韩精品高清不卡| 欧美在线一区二区三区| 亚洲视频 欧洲视频| 久久久久国产精品麻豆ai换脸| 91丨九色丨蝌蚪丨老版| 精品动漫一区二区三区在线观看| 亚洲成人www| 91色porny蝌蚪| 国产精品毛片久久久久久| 国产一区中文字幕| 欧美tickle裸体挠脚心vk| 日韩精品视频网站| 欧美高清视频www夜色资源网| 亚洲免费av在线| av亚洲精华国产精华精| 中文字幕 久热精品 视频在线 | 粉嫩aⅴ一区二区三区四区五区| 日韩欧美国产高清| 麻豆精品国产传媒mv男同| 7777精品久久久大香线蕉| 日韩经典一区二区| 91精品国产免费| 蜜臀av一级做a爰片久久| 国产欧美日韩在线看| 国产精品一线二线三线精华| 久久看人人爽人人| 国产福利电影一区二区三区| 久久精品综合网| 成人一级视频在线观看| 国产精品免费丝袜| 91亚洲国产成人精品一区二三| 国产精品私人影院| 色综合一区二区| 一区二区三区 在线观看视频| 欧美午夜片在线观看| 五月综合激情网| 日韩视频一区二区在线观看| 精品一区二区三区在线播放| 26uuu国产在线精品一区二区| 国产精品亚洲一区二区三区在线| 国产亚洲一区二区三区四区| 成人黄色软件下载| 亚洲天堂福利av| 欧美亚洲综合网| 日本不卡123| 国产日本一区二区| 91免费精品国自产拍在线不卡| 亚洲国产成人av网| 日韩久久免费av| 国产成人av电影在线| 亚洲色大成网站www久久九九| 精品视频一区二区不卡| 精品亚洲porn| 亚洲精品视频在线看| 3d动漫精品啪啪| 风间由美一区二区av101| 亚洲精品国产高清久久伦理二区| 欧美日韩一区精品| 国产成人综合网站| 亚洲国产精品综合小说图片区| 精品国产伦一区二区三区观看方式 | 六月婷婷色综合| 欧美国产在线观看| 欧美日韩一区二区三区在线| 欧美日韩激情一区| 久久国内精品视频| 亚洲欧美电影院| 久久先锋影音av鲁色资源| 91精品福利在线| 经典三级一区二区| 一区二区三区四区视频精品免费| 欧美一区二区啪啪| 99精品视频一区二区三区| 奇米影视在线99精品| 亚洲天堂成人在线观看| 欧美电影免费提供在线观看| 99久久精品久久久久久清纯| 麻豆国产欧美一区二区三区| 亚洲女人的天堂| 久久综合九色综合97婷婷女人 | 精品国产精品网麻豆系列| 色综合久久久久| 国产另类ts人妖一区二区| 午夜激情一区二区|