📄 serverinfoview_2.cpp
字号:
// 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 + -