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

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

?? globals.cpp

?? OPC客戶端源代碼
?? CPP
字號:
// **************************************************************************
// globals.cpp
//
// Description:
//	This is where global variables are initialized and global functions are
//	implemented.
//
// DISCLAIMER:
//	This programming example is provided "AS IS".  As such Kepware, Inc.
//	makes no claims to the worthiness of the code and does not warranty
//	the code to be error free.  It is provided freely and can be used in
//	your own projects.  If you do find this code useful, place a little
//	marketing plug for Kepware in your code.  While we would love to help
//	every one who is trying to write a great OPC client application, the 
//	uniqueness of every project and the limited number of hours in a day 
//	simply prevents us from doing so.  If you really find yourself in a
//	bind, please contact Kepware's technical support.  We will not be able
//	to assist you with server related problems unless you are using KepServer
//	or KepServerEx.
// **************************************************************************


#include "stdafx.h"
#include "mainwnd.h"

// Clipboard formats for data access 1.0 streams:
UINT CF_DATA_CHANGE = RegisterClipboardFormat (_T("OPCSTMFORMATDATA"));
UINT CF_DATA_CHANGE_TIME	= RegisterClipboardFormat (_T("OPCSTMFORMATDATATIME"));
UINT CF_WRITE_COMPLETE = RegisterClipboardFormat (_T("OPCSTMFORMATWRITECOMPLETE"));

// Clipboard formats for cut/copy/paste:
UINT CF_SERVER = RegisterClipboardFormat (_T("QCOpcClientServer"));
UINT CF_GROUP = RegisterClipboardFormat (_T("QCOpcClientGroup"));
UINT CF_ITEM = RegisterClipboardFormat (_T("QCOpcClientItem"));

// Special error messages only used in debug builds:
#ifdef _DEBUG
	LPCTSTR _dbg_szMallocFailedMsg = _T("Memory allocation failure in module %s at line %d\n");
	LPCTSTR _dbg_szExceptionMsg = _T("Exception handler invoked in module %s at line %d\n");
#endif


// **************************************************************************
// LogMsg ()
//
// Description:
//	Log a message to our application's event window.
//
// Parameters:
//  UINT		nResID		String resource ID
//							  15000 - 15999 info
//							  16000 - 16999 error
//							Additional arguments can be strings or 
//							  numerical values to be used in message string.
//							  Place format specifiers in string resource.
//
// Returns:
//  void
// **************************************************************************
void LogMsg (UINT nResID, ...)
	{
	EVENTTYPE eType;

	// Get pointer to additional argument list (which starts after nResID):
	va_list args;
	va_start (args, nResID);

	// Allocate a buffer for message text:
	int nBuf;
	TCHAR szBuffer [512];
	
	// Load the specified string resource.  It should contain format 
	// specifiers if additional arguments are given.
	CString strFmt;
	strFmt.LoadString (nResID);

	// Contruct the message string:
	nBuf = _vsntprintf (szBuffer, sizeof (szBuffer) / sizeof (szBuffer[0]), (LPCTSTR)strFmt, args);

	// Chect to see if there was there an error, indicated by nBuf=0.  Debug only.
	// (was the expanded string too long?)
	ASSERT (nBuf >= 0);

	// Determine the type of message implied by string resource number.
	// (see range in function header above)
	if (nResID >= EVENT_FIRSTINFO && nResID <= EVENT_LASTINFO)
		eType = tEventInformation;
	else if (nResID >= EVENT_FIRSTERROR && nResID <= EVENT_LASTERROR)
		eType = tEventError;
	else
		{
		// String resource ID not in range.  Programmer error.
		ASSERT (FALSE);
		}

	// Add the message to the queue.

	// First get pointer to the application's main window:
	CKMainWnd *pMainWnd = (CKMainWnd *)AfxGetMainWnd ();

	// If pointer looks valid, call LogMsg() function to place message
	// in queue.
	if (pMainWnd && ::IsWindow (pMainWnd->m_hWnd))
		pMainWnd->LogMsg (eType, szBuffer);

	// Reset additional arguments pointer:
	va_end (args);
	}

// **************************************************************************
// UpdateItemCount ()
//
// Description:
//	Update global item count maintained in CKMainWnd object.
//
// Parameters:
//  int			nDelta		Number of items to add to count.
//
// Returns:
//  void
// **************************************************************************
void UpdateItemCount (int nDelta)
	{
	// Add the update item message to the queue.

	// First need to get pointer to application's main window:
	CKMainWnd *pMainWnd = (CKMainWnd *)AfxGetMainWnd ();

	// If pointer looks OK, call UpdateItemCount() function to
	// place message in queue.
	if (pMainWnd && ::IsWindow (pMainWnd->m_hWnd))
		pMainWnd->UpdateItemCount (nDelta);
	}

// **************************************************************************
// VartypeFromString ()
//
// Description:
//	Returns a vartype based on a string description.
//
// Parameters:
//  LPCTSTR		lpszType		Variant type (Boolean, Byte, etc)
//
// Returns:
//  VARTYPE - Type (VT_BOOL, VTU1, etc.), or VT_EMPTY if input invalid.
// **************************************************************************
VARTYPE VartypeFromString (LPCTSTR lpszType)
	{
	VARTYPE vtType;

	// Compare input type string with supported types and return the
	// corresponding variant type.  (A match is found when lstrcmpi returns
	// zero.)  If specified type is not supported, then return VT_EMPTY.
	// These strings must match those used below in StringFromVartype().
	if (lstrcmpi (lpszType, _T("Boolean")) == 0)
		vtType = VT_BOOL;
	else if (lstrcmpi (lpszType, _T("Byte")) == 0)
		vtType = VT_UI1;
	else if (lstrcmpi (lpszType, _T("Byte Array")) == 0)
		vtType = VT_UI1 | VT_ARRAY;
	else if (lstrcmpi (lpszType, _T("Char")) == 0)
		vtType = VT_I1;
	else if (lstrcmpi (lpszType, _T("Char Array")) == 0)
		vtType = VT_I1 | VT_ARRAY;
	else if (lstrcmpi (lpszType, _T("Word")) == 0)
		vtType = VT_UI2;
	else if (lstrcmpi (lpszType, _T("Word Array")) == 0)
		vtType = VT_UI2 | VT_ARRAY;
	else if (lstrcmpi (lpszType, _T("Short")) == 0)
		vtType = VT_I2;
	else if (lstrcmpi (lpszType, _T("Short Array")) == 0)
		vtType = VT_I2 | VT_ARRAY;
	else if (lstrcmpi (lpszType, _T("DWord")) == 0)
		vtType = VT_UI4;
	else if (lstrcmpi (lpszType, _T("DWord Array")) == 0)
		vtType = VT_UI4 | VT_ARRAY;
	else if (lstrcmpi (lpszType, _T("Long")) == 0)
		vtType = VT_I4;
	else if (lstrcmpi (lpszType, _T("Long Array")) == 0)
		vtType = VT_I4 | VT_ARRAY;
	else if (lstrcmpi (lpszType, _T("Float")) == 0)
		vtType = VT_R4;
	else if (lstrcmpi (lpszType, _T("Float Array")) == 0)
		vtType = VT_R4 | VT_ARRAY;
	else if (lstrcmpi (lpszType, _T("Double")) == 0)
		vtType = VT_R8;
	else if (lstrcmpi (lpszType, _T("Double Array")) == 0)
		vtType = VT_R8 | VT_ARRAY;
	else if (lstrcmpi (lpszType, _T("String")) == 0)
		vtType = VT_BSTR;
	else
		vtType = VT_EMPTY;

	// Return variant type:
	return (vtType);
	}

// **************************************************************************
// StringFromVartype ()
//
// Description:
//	Returns a string description based on a vartype.
//
// Parameters:
//	VARTYPE		vtType		Input variant type (VT_BOOL, VT_UI1, etc.)
//	CString		&strType	Output string corresponding to input type. If no
//							  type specified, then return "Native".
//
// Returns:
//	void
// **************************************************************************
void StringFromVartype (VARTYPE vtType, CString &strType)
	{
	// Return a string describing the specified variant type.  These strings
	// must match those used above in VartypeFromString().
	switch (vtType & ~VT_ARRAY)
		{
		case VT_BOOL:	strType = _T("Boolean");	break;
		case VT_UI1:	strType = _T("Byte");		break;
		case VT_I1:		strType = _T("Char");		break;
		case VT_UI2:	strType = _T("Word");		break;
		case VT_I2:		strType = _T("Short");		break;
		case VT_UI4:	strType = _T("DWord");		break;
		case VT_I4:		strType = _T("Long");		break;
		case VT_R4:		strType = _T("Float");		break;
		case VT_R8:		strType = _T("Double");		break;
		case VT_BSTR:	strType = _T("String");		break;
		default:		strType = _T("Native");		break;
		}

	// Append " Array" if a variant array type:
	if ((vtType & VT_ARRAY) != 0)
		strType += _T(" Array");
	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一区二区中文字幕| 最新不卡av在线| 亚洲视频免费观看| 日本sm残虐另类| 91在线国产观看| 亚洲精品在线免费播放| 亚洲福利一区二区| 丁香啪啪综合成人亚洲小说| 欧美另类videos死尸| ...av二区三区久久精品| 国精产品一区一区三区mba视频 | 色综合久久综合| 久久久久九九视频| 日本不卡一区二区| 欧美在线综合视频| 亚洲免费观看高清完整版在线观看熊| 捆绑变态av一区二区三区| 欧美日韩精品电影| 一区二区激情小说| 91小视频免费观看| 五月激情综合网| 91美女精品福利| 亚洲色图欧美在线| 91日韩精品一区| 中文字幕一区二区三区蜜月| 国产91富婆露脸刺激对白| 精品国产一区a| 日本aⅴ免费视频一区二区三区| 欧美在线视频你懂得| 一区二区视频在线看| www.欧美精品一二区| 国产精品久久久久影院色老大| 国产精品一级黄| 久久精品人人做人人爽97| 狠狠色综合日日| wwwwww.欧美系列| 国产综合成人久久大片91| 精品国产百合女同互慰| 国产一区二区三区四| 国产午夜亚洲精品午夜鲁丝片| 国产一区二区三区免费播放| 久久久久国产精品麻豆ai换脸| 国产乱码一区二区三区| 国产精品国产三级国产aⅴ原创 | 欧美日产在线观看| 日韩1区2区3区| 亚洲精品一区二区三区99| 国产在线一区二区综合免费视频| 国产亚洲女人久久久久毛片| 成人av午夜电影| 亚洲男女毛片无遮挡| 欧美日韩国产综合久久| 狠狠色狠狠色综合| 国产精品理论在线观看| 欧美午夜精品一区二区蜜桃| 日本不卡一二三区黄网| 国产免费观看久久| 欧美性淫爽ww久久久久无| 免费观看成人鲁鲁鲁鲁鲁视频| 久久久精品2019中文字幕之3| aaa亚洲精品一二三区| 亚洲成人在线网站| 久久午夜国产精品| 色老头久久综合| 久久99精品国产91久久来源| 国产精品毛片高清在线完整版| 欧美视频中文一区二区三区在线观看| 日韩av一级电影| 国产精品精品国产色婷婷| 91精品黄色片免费大全| 成年人网站91| 日韩国产在线一| 中文字幕国产一区| 91精品国产一区二区人妖| 粉嫩久久99精品久久久久久夜| 亚洲自拍另类综合| 中文一区二区完整视频在线观看| 欧美熟乱第一页| www.激情成人| 裸体健美xxxx欧美裸体表演| 《视频一区视频二区| 欧美tk—视频vk| 精品视频全国免费看| 懂色一区二区三区免费观看| 日韩中文字幕一区二区三区| 国产精品久久久久久久久快鸭 | 亚洲天堂福利av| 精品久久久久久久久久久久久久久 | 国产精品一区一区三区| 午夜精品一区在线观看| 亚洲国产精品成人综合色在线婷婷| 欧美日韩在线观看一区二区| 成人永久aaa| 精品一区在线看| 丝袜国产日韩另类美女| 1024国产精品| 久久精品人人做人人爽人人| 日韩一区二区在线看片| 欧美日韩在线观看一区二区| 91亚洲大成网污www| 国产成人8x视频一区二区| 久久99精品国产.久久久久久| 天堂蜜桃91精品| 丝袜亚洲精品中文字幕一区| 一区二区三区四区视频精品免费| 国产精品精品国产色婷婷| 国产人伦精品一区二区| 久久女同性恋中文字幕| 2024国产精品| 久久久久久久久久久久久夜| 精品动漫一区二区三区在线观看| 欧美日韩综合在线免费观看| 欧美日韩和欧美的一区二区| 欧美日韩精品一二三区| 精品视频一区二区三区免费| 欧美色精品天天在线观看视频| 色综合久久天天| 在线观看不卡视频| 欧美丰满美乳xxx高潮www| 欧美理论片在线| 日韩欧美123| 久久精品日韩一区二区三区| 国产午夜精品久久久久久免费视| 国产日产欧美一区二区三区| 国产三级精品在线| 中文乱码免费一区二区| 亚洲欧洲韩国日本视频| 亚洲女同一区二区| 亚洲成人福利片| 麻豆国产欧美日韩综合精品二区 | 国产精品亲子乱子伦xxxx裸| 国产精品国产三级国产aⅴ中文 | 91久久一区二区| 51午夜精品国产| 亚洲精品一区二区三区蜜桃下载| 国产日韩视频一区二区三区| 国产精品久久久爽爽爽麻豆色哟哟| 亚洲美女视频在线观看| 天堂一区二区在线免费观看| 精品一区二区影视| k8久久久一区二区三区| 精品视频一区三区九区| 精品国产sm最大网站| 国产精品色呦呦| 亚洲高清一区二区三区| 精品一区二区三区免费播放 | 国产一区二区三区黄视频 | 在线不卡的av| 国产欧美精品一区二区色综合| 亚洲美女在线一区| 久久er99精品| 欧美专区在线观看一区| 久久婷婷成人综合色| 亚洲美女淫视频| 狠狠色狠狠色综合系列| 欧美在线播放高清精品| 欧美精品一区二区三区蜜桃| 中文字幕一区二区三区视频| 青青草成人在线观看| 99久久综合色| 日韩欧美亚洲国产另类| 一区二区三区资源| 国产一区二区三区在线观看精品| 91久久线看在观草草青青| 精品福利二区三区| 亚洲高清久久久| av不卡一区二区三区| 久久亚洲精品小早川怜子| 五月天激情综合| 91啪亚洲精品| 国产日韩视频一区二区三区| 日本在线观看不卡视频| 日本道色综合久久| 中文字幕视频一区| 国产精品一区二区不卡| 日韩精品影音先锋| 亚洲国产欧美在线人成| 91在线无精精品入口| 久久久久久97三级| 久久精品噜噜噜成人88aⅴ | 成人爱爱电影网址| 久久久国产精品不卡| 蜜桃在线一区二区三区| 欧美日韩在线播| 亚洲精品高清视频在线观看| 国产盗摄视频一区二区三区| 日韩欧美一区电影| 日本不卡中文字幕| 91麻豆精品久久久久蜜臀| 亚洲精品日产精品乱码不卡| 粉嫩av一区二区三区在线播放| 久久一区二区三区国产精品| 美日韩一级片在线观看| 欧美精品第1页| 五月婷婷激情综合| 欧美老女人在线| 亚洲观看高清完整版在线观看| av日韩在线网站| 国产精品美女久久久久高潮| av不卡免费在线观看|