⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serverinfoview_2.cpp

📁 VisualC++通信编程工程实例精解 Chapter 2 Example 1 MSCOMM控件编程实例 Example 2 基于Windows API的虚拟终端实现 Example 3
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ServerInfoView_2.cpp : implementation file
//

#include "stdafx.h"
#include "OpcClientSpy.h"
#include "ServerInfoView.h"

#include <LMCONS.H>
#include <lmserver.h>

extern const CLSID CLSID_OPCServerList;
#define __GUID_DEFINED__
#include "OPCDa_Cats.c"
//static const GUID CLSID_OPCServerList = 
//	{ 0x50fa5e8c, 0xdfae, 0x4ba7, { 0xb6, 0x9a, 0x8f, 0x38, 0xc2, 0xfd, 0x6c, 0x27 } };
//extern const GUID CATID_OPCDAServer10;

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CONST ULONG NEXT_COUNT = 100; // number of elements to request when calling Next

/////////////////////////////////////////////////////////////////////////////
// CServerInfoView message handlers

void CServerInfoView::OnSize(UINT nType, int cx, int cy) 
{
	CFormView::OnSize(nType, cx, cy);
	
	CFormView::ShowScrollBar(SB_VERT,FALSE);
	CFormView::ShowScrollBar(SB_HORZ,FALSE);

	if (GetSafeHwnd())
	{
		if (m_server.GetSafeHwnd())
		{
			CRect rect(0,0,cx,cy);
			m_server.MoveWindow(&rect);
		}
	}	
}

//初始化
void CServerInfoView::InitRootInfo(void)
{
	//装入图标
	if( m_pImageList==NULL )//只装一次
	{
		m_pImageList = new CImageList();
		m_pImageList->Create(16, 16, ILC_COLOR, 7, 1);
		CBitmap bitmap;
		bitmap.LoadBitmap(IDB_BITMAP_SERVER_ICON);
		m_pImageList->Add(&bitmap, (COLORREF)0x000000);
		bitmap.DeleteObject();
		m_server.SetImageList(m_pImageList,LVSIL_NORMAL);
	}
	//初始化Root
	int iItem[] = {0,1};
	char *strText[] = {"本地","远端"};
	HTREEITEM *hRoot[] = {&m_hRoot1,&m_hRoot2};
	TVINSERTSTRUCT  curTreeItem;
	for( int k=0;k<2;k++ )
	{
		curTreeItem.hParent =NULL;
		curTreeItem.hInsertAfter = TVI_LAST;
		curTreeItem.item.iImage = iItem[k];
		curTreeItem.item.iSelectedImage = curTreeItem.item.iImage ;
		curTreeItem.item.pszText = strText[k];
		curTreeItem.item.mask =	 TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT| TVIF_PARAM;
		curTreeItem.item.lParam = k;
		*hRoot[k] = m_server.InsertItem(&curTreeItem);
	}
	//初始化本地和远端
	char *strDa[] = {"OPC数据1.0","OPC数据2.0"};
	HTREEITEM *hLocalRemote[] = {&m_hLocalDA1,&m_hRemoteDA1,
								 &m_hLocalDA2,&m_hRemoteDA2};
	for( k=0;k<2;k++ )
		for( int t=0;t<2;t++ )
		{
			curTreeItem.hParent = *hRoot[t];
			curTreeItem.hInsertAfter = TVI_LAST;
			curTreeItem.item.iImage = 4;
			curTreeItem.item.iSelectedImage = curTreeItem.item.iImage ;
			curTreeItem.item.pszText = strDa[k];
			curTreeItem.item.mask =	 TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT| TVIF_PARAM;
			curTreeItem.item.lParam = (k+1)*(t+1)+1;
			*hLocalRemote[k*2+t] = m_server.InsertItem(&curTreeItem);
		}
}

//将1.0的DA加到树中
HTREEITEM  CServerInfoView::AddV1ItemToTree(OPCServerInfo serverInfo)
{
	TVINSERTSTRUCT curItem;
	if( serverInfo.m_nodeName.CompareNoCase(m_strLocalName)==0 )
		curItem.hParent = m_hLocalDA1;
	else
		curItem.hParent = m_hRemoteDA1;
	curItem.hInsertAfter = TVI_LAST;
	curItem.item.iImage = 5;
	curItem.item.iSelectedImage = curItem.item.iImage ;
	CString strText = serverInfo.m_ProgID;
	if( serverInfo.m_nodeName.CompareNoCase(m_strLocalName)!=0 )
		strText = serverInfo.m_ProgID+"("+serverInfo.m_nodeName+")";
	curItem.item.pszText = (char *)LPCTSTR(strText);
	curItem.item.mask =	 TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT| TVIF_PARAM;
	curItem.item.lParam = 0;
	return m_server.InsertItem(&curItem);
}


//将2.0的DA加到树中
HTREEITEM  CServerInfoView::AddV2ItemToTree(OPCServerInfo serverInfo)
{
	TVINSERTSTRUCT curItem;
	if( serverInfo.m_nodeName.CompareNoCase(m_strLocalName)==0 )
		curItem.hParent = m_hLocalDA2;
	else
		curItem.hParent = m_hRemoteDA2;
	curItem.hInsertAfter = TVI_LAST;
	curItem.item.iImage = 5;
	curItem.item.iSelectedImage = curItem.item.iImage ;
	CString strText = serverInfo.m_ProgID;
	if( serverInfo.m_nodeName.CompareNoCase(m_strLocalName)!=0 )
		strText = serverInfo.m_ProgID+"("+serverInfo.m_nodeName+")";
	curItem.item.pszText = (char *)LPCTSTR(strText);
	curItem.item.mask =	 TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT| TVIF_PARAM;
	curItem.item.lParam = 0;
	return m_server.InsertItem(&curItem);
}

//enum net resource
BOOL CServerInfoView::EnumerateNodes(LPNETRESOURCE lpnr)
{
   HANDLE hEnum = 0;
   DWORD dwResult = WNetOpenEnum(RESOURCE_GLOBALNET,
                     RESOURCETYPE_ANY,
                     RESOURCEUSAGE_CONTAINER,
                     lpnr,              // NULL first time this function is called
                     &hEnum);           // handle to resource

   if (dwResult != NO_ERROR)
      return FALSE;

   DWORD cbBuffer = 16384;      // 16K buffer
   LPNETRESOURCE lpnrLocal = (LPNETRESOURCE) GlobalAlloc(GPTR, cbBuffer);
   do
   {
      DWORD cEntries = 0xFFFFFFFF; // enumerate all possible entries
      dwResult = WNetEnumResource(hEnum,
                                  &cEntries,
                                  lpnrLocal,
                                  &cbBuffer);

      if (dwResult == NO_ERROR)
      {
         for( DWORD i = 0; i < cEntries; i++)
         {
            // If this NETRESOURCE is a container, call the function
            // recursively.
            if(RESOURCEUSAGE_CONTAINER ==
               (lpnrLocal[i].dwUsage & RESOURCEUSAGE_CONTAINER))
            {
               if(RESOURCEDISPLAYTYPE_SERVER == lpnrLocal[i].dwDisplayType )
               {
                  CString node(lpnrLocal[i].lpRemoteName);
                  int index = node.Find( _T("\\") );
                  if( index > -1 )
                     node = node.Mid(index+2);
				  //加入到队列中
				  m_strNodeList.AddTail(node);
               }
               else//不是Server
               {
                  EnumerateNodes(&lpnrLocal[i]);
                  //break;   // ONLY enumerate the first "Container"
               }
            }
         }//end of for...
      }//end of if (dwResult
      else if (dwResult != ERROR_NO_MORE_ITEMS)
      {
         break;
      }
   }
   while(dwResult != ERROR_NO_MORE_ITEMS);

   GlobalFree((HGLOBAL) lpnrLocal);
   dwResult = WNetCloseEnum(hEnum);
   if (dwResult != NO_ERROR)
      return FALSE;
   return TRUE;
}


/***********************************************
     使用2.0 的方法取到所有的OPC Server 2.0   1.0
************************************************/
BOOL CServerInfoView::GetOPCServers20(LPTSTR node,CLSID catid)
{
	CString strDateTime="CATID_OPCDAServer10";//日期时间处的提示信息.
	if( catid==CATID_OPCDAServer20 )
		strDateTime = "CATID_OPCDAServer20";

	USES_CONVERSION;

	// New 2.0 method using component categories
	IOPCServerList* pServers=NULL;
	COSERVERINFO si;
	MULTI_QI  qi;

	si.dwReserved1 = 0;
	si.pwszName = NULL;
	if( node && node[0] != 0 )
		si.pwszName = T2OLE(node);
	si.pAuthInfo = NULL;
	si.dwReserved2 = 0;

	qi.pIID = &IID_IOPCServerList;
	qi.pItf = NULL;
	qi.hr = 0;

	HRESULT hr = CoCreateInstanceEx(CLSID_OPCServerList, NULL, CLSCTX_ALL, &si, 1, &qi);
	if (FAILED(hr) || FAILED(qi.hr))
	{
		CString msg;
		msg.Format(_T("Error connecting to OPC 2.0 Server Browser on %s."), (LPCTSTR)node);
		m_pInfoForm->ShowInfoToList(WENHAO,strDateTime,msg);

		if( hr == REGDB_E_CLASSNOTREG )
		{
			CString msg;
			msg.Format(_T("Please install the OPC 2.0 Components on %s."), (LPCTSTR)node);
			m_pInfoForm->ShowInfoToList(WENHAO,strDateTime,msg);
		}
	}
	else
	{
		pServers = (IOPCServerList*)qi.pItf;
		IEnumGUID *pEnumGUID=NULL;
		hr = pServers->EnumClassesOfCategories(1, &catid, 1, &catid, &pEnumGUID);
		if( SUCCEEDED(hr) )
		{
			unsigned long count;
			CLSID clsid[NEXT_COUNT];

			do
			{
				hr = pEnumGUID->Next(NEXT_COUNT, clsid, &count);
				for( ULONG index=0; index<count; index++ )
				{
					LPOLESTR pszProgID;
					LPOLESTR pszUserType;
					HRESULT hr2 = pServers->GetClassDetails(clsid[index], &pszProgID, &pszUserType);
					if (SUCCEEDED(hr2))
					{
						OPCServerInfo* pServerInfo = new OPCServerInfo(pszProgID, pszUserType, clsid[index] );
						pServerInfo->m_nodeName = node;
						m_vServers.AddTail( pServerInfo );
						//填入树中
						if( catid==CATID_OPCDAServer20 )
						{
						HTREEITEM curHandle = AddV2ItemToTree(*pServerInfo);
						if( curHandle!=0 )
							pServerInfo->m_indexItem = curHandle;
						}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -