infoserver.cpp
来自「此为Insight opc client InfoServerExplorer源」· C++ 代码 · 共 1,428 行 · 第 1/3 页
CPP
1,428 行
return FALSE;
}
}
BOOL CInfoServer::RecreateOnServer()
{
for(int g = 0; g < m_Groups.GetSize(); g++)
{
if(ReCreateGroupOnServer(&m_Groups[g]))
{
//recreate its points
CArray<CItem*, CItem*>* pItems;
unsigned int nItems = 0;
nItems = m_Groups[g]->GetItems(&pItems);
for(unsigned int i = 0; i < nItems; i++)
{
if(!m_Groups[g]->ReCreateItemOnServer(&(*pItems)[i]))
{
return FALSE;
}
}
}
else
return FALSE;
}
return TRUE;
}
BOOL CInfoServer::RemoveGroup(CGroup** group)
{
HRESULT res;
CIOPCServer opcServer(m_pUnkn);
int nGroups, nItems;
BOOL bRet = FALSE;
TRACE("Reference count should be 0 !\n");
TRACE("UnAdvise needed ?\n");
if(IsConnected())
{
(*group)->UnAdvise();
res = opcServer.RemoveGroup((*group)->GetHandle(), TRUE); //force delete (even if references are outstanding)
if(SUCCEEDED(res))
{
bRet = TRUE;
}
else
{
DisplayError(res);
bRet = FALSE;
}
}
else
{
bRet = FALSE;
}
//since following code handles only client memory it is always executed.
nGroups = m_Groups.GetSize();
for(int g = 0; g < nGroups; g++)
{
if( *group == m_Groups[g] )
{
//delete the items (No RemoveItem() is necessary; RemoveGroups removes the items)
CArray<CItem*, CItem*>* pItems;
nItems = m_Groups[g]->GetItems(&pItems);
for(int i = 0; i < nItems ; i++)
{
CItem* pItem;
pItem = (*pItems)[0];
pItems->RemoveAt(0,1);
delete pItem;
}
pItems->FreeExtra();
delete *group;
m_Groups.RemoveAt(g,1);
m_Groups.FreeExtra();
break;
}
}
if(bRet) ((CInfoServerExplorerApp*)AfxGetApp())->DisplayText(_T("Group successfuly removed."));
return bRet;
}
BOOL CInfoServer::EditGroup(CGroup** group)
{
USES_CONVERSION;
CGroupDlg dlg;
CIOPCGroupStateMgt opcGroup((*group)->GetInterface());
OPCHANDLE hClientGroup; //out -> in => no modification
OPCHANDLE hServerGroup; //out: not used
DWORD rate; //out: servers rate
LPWSTR pGroupName;
BOOL bRet = FALSE;
if((*group)->GetDataChangeEnabled(&dlg.m_bDataChange, FALSE))
{
//is what we store the same as on the server ?
BOOL bNewDataChange = FALSE;
(*group)->GetDataChangeEnabled(&bNewDataChange, TRUE);
if(bNewDataChange != dlg.m_bDataChange)
{
((CInfoServerExplorerApp*)AfxGetApp())->DisplayText(_T("CGroup::m_bDataChange inconsistency to IOPCAsyncIO2::GetEnabled()."));
ASSERT(0);
}
if(SUCCEEDED(opcGroup.GetState( &dlg.m_dwUpdateRate, &dlg.m_bActive,
&pGroupName,
&dlg.m_lTimeBias,
&dlg.m_fDeadBand,
&dlg.m_dwLCID,
&hClientGroup,
&hServerGroup
)))
{
dlg.m_sGroup = OLE2A(pGroupName);
if(IDOK == dlg.DoModal())
{
if(SUCCEEDED(opcGroup.SetState( &dlg.m_dwUpdateRate,
&rate,
&dlg.m_bActive,
&dlg.m_lTimeBias,
&dlg.m_fDeadBand,
&dlg.m_dwLCID,
&hClientGroup)))
{
(*group)->SetActive(dlg.m_bActive);
(*group)->SetUpdateRate(rate);
(*group)->SetTimeBias(dlg.m_lTimeBias);
(*group)->SetDeadBand(dlg.m_fDeadBand);
(*group)->SetLCID(dlg.m_dwLCID);
if(SUCCEEDED(opcGroup.SetName(A2OLE(dlg.m_sGroup))))
{
(*group)->SetName(dlg.m_sGroup);
((CInfoServerExplorerApp*)AfxGetApp())->DisplayText(_T("Edited group successfuly."));
bRet = (*group)->SetDataChangeEnabled(dlg.m_bDataChange);
}
}
}
}
CoTaskMemFree(pGroupName);
}
return bRet;
}
BOOL CInfoServer::GetStatus()
{
USES_CONVERSION;
CServerStatusDlg dlg;
OPCSERVERSTATUS* pServerStatus;
BOOL bRet = FALSE;
CIOPCServer opcServer(m_pUnkn);
HRESULT res;
res = opcServer.GetStatus(&pServerStatus);
if(SUCCEEDED(res))
{
if(pServerStatus->dwBandWidth == 0xFFFFFFFF)
dlg.m_sBandwidth.Format(IDS_OPC_UNKNOWN);
else
dlg.m_sBandwidth.Format("%d", pServerStatus->dwBandWidth);
dlg.m_sGroups.Format("%d",pServerStatus->dwGroupCount);
if(pServerStatus->ftStartTime.dwHighDateTime != 0)
{
CTime tStart(pServerStatus->ftStartTime);
dlg.m_sStartTime = tStart.Format(_T("%c"));
}
else
dlg.m_sStartTime.Format(IDS_OPC_UNKNOWN);
if(pServerStatus->ftCurrentTime.dwHighDateTime != 0)
{
CTime tCurrent(pServerStatus->ftCurrentTime);
dlg.m_sCurrentTime = tCurrent.Format(_T("%c"));
}
else
dlg.m_sCurrentTime.Format(IDS_OPC_UNKNOWN);
if(pServerStatus->ftLastUpdateTime.dwHighDateTime != 0)
{
CTime tLastUpdate(pServerStatus->ftLastUpdateTime);
dlg.m_sLastUpdateTime = tLastUpdate.Format(_T("%c"));
}
else
dlg.m_sLastUpdateTime.Format(IDS_OPC_NOUPDATES);
switch(pServerStatus->dwServerState)
{
case OPC_STATUS_FAILED:
{
dlg.m_sStatus.Format(IDS_OPC_SERVER_STATUS_FAILED);
break;
}
case OPC_STATUS_RUNNING:
{
dlg.m_sStatus.Format(IDS_OPC_SERVER_STATUS_RUNNING);
break;
}
case OPC_STATUS_NOCONFIG:
{
dlg.m_sStatus.Format(IDS_OPC_SERVER_STATUS_NOCONFIG);
break;
}
case OPC_STATUS_SUSPENDED:
{
dlg.m_sStatus.Format(IDS_OPC_SERVER_STATUS_SUSPENDED);
break;
}
case OPC_STATUS_TEST:
{
dlg.m_sStatus.Format(IDS_OPC_SERVER_STATUS_TEST);
break;
}
default:
{
dlg.m_sStatus.Format(IDS_OPC_UNKNOWN);
break;
}
}
dlg.m_sVendorInfo = OLE2A(pServerStatus->szVendorInfo);
dlg.m_sMayorVersion.Format("%d", pServerStatus->wMajorVersion);
dlg.m_sMinorVersion.Format("%d", pServerStatus->wMinorVersion);
dlg.m_sBuildNumber.Format("%d", pServerStatus->wBuildNumber);
((CInfoServerExplorerApp*)AfxGetApp())->DisplayText(_T("GetStatus() returned success."));
dlg.DoModal();
bRet = TRUE;
}
else
{
bRet = FALSE;
((CInfoServerExplorerApp*)AfxGetApp())->DisplayText(_T("GetStatus()"), res);
}
if(NULL !=pServerStatus)
{
CoTaskMemFree(pServerStatus->szVendorInfo);
CoTaskMemFree(pServerStatus);
}
return bRet;
}
CComPtr<IUnknown> CInfoServer::GetInterface()
{
return m_pUnkn;
}
CIAdviseSink** CInfoServer::GetAdviseSink()
{
return &m_pAdviseSink;
}
CComObject<COPCConnectionPoint>** CInfoServer::GetDataAccessConnectionPoint()
{
return &m_pDataAccessConnectionPoint;
}
BOOL CInfoServer::GetErrorString(HRESULT hr, CString& sErrorText)
{
USES_CONVERSION;
BOOL bRet = FALSE;
BOOL bStringSet = FALSE;
try
{
if((m_pUnkn != NULL) && IsConnected())
{
CIOPCServer opcServer(m_pUnkn);
LPWSTR pErrorString = NULL;
//returns error texts for OPC and windows errors
hr = opcServer.GetErrorString(hr, 0, &pErrorString);
if(SUCCEEDED(hr))
{
sErrorText = OLE2A(pErrorString);
bRet = TRUE;
bStringSet = TRUE;
}
CoTaskMemFree(pErrorString);
}
}
catch(...)
{
//go ahead an try GetSystemErrorString
}
if(!bStringSet)
{
bRet = GetSystemErrorString(hr, sErrorText);
}
return bRet;
}
BOOL CInfoServer::GetSystemErrorString(HRESULT hr, CString& sErrorText)
{
TCHAR* sMsg = NULL;
CString sErrorHRESULT;
try
{
if(HRESULT_FACILITY(hr) == FACILITY_WINDOWS)
hr = HRESULT_CODE(hr);
if(0 != FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
hr,
MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
(LPTSTR)&sMsg, 0, NULL ))
{
sErrorHRESULT.Format(_T(" (%#x)."), hr);
sErrorText = CString(sMsg) + sErrorHRESULT;
LocalFree(sMsg);
return TRUE;
}
}
catch(...)
{
sErrorText = _T("Exception in CInfoServer::GetSystemErrorString()");
TRACE(sErrorText);
}
return FALSE;
}
//for convinience
BOOL CInfoServer::DisplayError(HRESULT dwError)
{
((CInfoServerExplorerApp*)AfxGetApp())->DisplayText(dwError);
return TRUE;
}
unsigned int CInfoServer::GetGroups(CArray<CGroup*, CGroup*>** groups)
{
*groups = &m_Groups;
return((*groups)->GetSize());
}
//options
float CInfoServer::GetOPCVersion()
{
return m_fOPCVersion;
}
void CInfoServer::SetOPCVersion(float opc_version)
{
m_fOPCVersion = opc_version;
}
int CInfoServer::GetDataChangeType()
{
return m_iDataChangeType;
}
void CInfoServer::SetDataChangeType(int iDataChangeType)
{
m_iDataChangeType = iDataChangeType;
}
UINT CInfoServer::GetReloadEnumNextElements()
{
return m_iReloadEnumNextElements;
}
void CInfoServer::SetReloadEnumNextElements(UINT elements)
{
m_iReloadEnumNextElements = elements;
}
/*
m_iReloadEnumMethod = 0: with IID_IEnumString
m_iReloadEnumMethod = 1: with IID_IEnumunknown
*/
int CInfoServer::GetReloadEnumMethod()
{
return m_iReloadEnumMethod;
}
void CInfoServer::SetReloadEnumMethod(int new_method)
{
m_iReloadEnumMethod = new_method;
}
UINT CInfoServer::GetReloadEnumAttributesNextElements()
{
return m_iReloadEnumAttributesNextElements;
}
void CInfoServer::SetReloadEnumAttributesNextElements(UINT elements)
{
m_iReloadEnumAttributesNextElements = elements;
}
UINT CInfoServer::GetBrowserEnumNextElements()
{
return m_iBrowserEnumNextElements;
}
void CInfoServer::SetBrowserEnumNextElements(UINT elements)
{
m_iBrowserEnumNextElements = elements;
}
BOOL CInfoServer::UseValidateItems()
{
return m_bUseValidateItems;
}
void CInfoServer::SetUseValidateItems(BOOL bUseValidateItems)
{
m_bUseValidateItems = bUseValidateItems;
}
void CInfoServer::SetOPCServer(CString sOPCServer)
{
m_sOPCServer = sOPCServer;
}
CString CInfoServer::GetOPCServer()
{
return m_sOPCServer;
}
void CInfoServer::SetOPCServerComputer(CString sOPCServerComputer)
{
m_sOPCServerComputer = sOPCServerComputer;
}
CString CInfoServer::GetOPCServerComputer()
{
return m_sOPCServerComputer;
}
CString CInfoServer::GetOPCServerName()
{
return m_sOPCServerComputer + CString(_T("\\")) + m_sOPCServer;
}
void CInfoServer::SetOPCServerCLSID(CLSID clsidOPCServer)
{
m_clsidOPCServer = clsidOPCServer;
}
CLSID CInfoServer::GetOPCServerCLSID()
{
return m_clsidOPCServer;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?