📄 opcclient.cpp
字号:
// opcclient.cpp : Implementation of Copcclient
#include "stdafx.h"
#include "ComServer.h"
#include "opcclient.h"
#include "opc.h"
#include "opcda.h"
#include "iadvsink.h"
#include "iopcdatacallback_imp.h"
#include "iopcshutdown_imp.h"
#include "opc_user.h"
/////////////////////////////////////////////////////////////////////////////
// Copcclient
IOPCServer * gpIOPCServer;
STDMETHODIMP Copcclient::opcinit(int *rcode)
{
// TODO: Add your implementation code here
char clsidString[128]=_T("");
char szNodeName[128];
char szServerName[80];
CLSID clsid;
HRESULT hr;
// m_szNodeName = _T("");
// m_szServerName = _T("");
if(opcsrv[0].clsContext != CLSCTX_REMOTE_SERVER) {
//user chose LOCAL or INPROC but user give a Node Name !!
szNodeName[128] = _T("");
}
// Get Class ID for server
// search the registry for OPC entries
HKEY hk = HKEY_CLASSES_ROOT;
HKEY hCLSID;
// Distant PC ?
if( szNodeName==NULL)
{
DWORD dwR;
dwR = RegConnectRegistry (szNodeName, HKEY_CLASSES_ROOT, &hk);
if( dwR != ERROR_SUCCESS )
{
//szMsg.Format(_T("RegConnectRegistry for %s on \\\\%s\n"),
// szServerName, szNodeName);
//CCrack::ShowErrorMessage(szMsg, dwR);
return E_FAIL;
}
}
DWORD dwR = RegOpenKey(hk, szServerName, &hCLSID );
if( dwR != ERROR_SUCCESS )
{
//szMsg.Format(_T("RegOpenkey for \\%s : \n"), szServerName);
//CCrack::ShowErrorMessage(szMsg, dwR);
return E_FAIL;
}
LONG size=_MAX_PATH;
dwR = RegQueryValue(hCLSID, _T("CLSID"), clsidString, &size );
if( dwR != ERROR_SUCCESS )
{
//szMsg.Format(_T("RegQueryValue (CLSID) for %s : \n"), szServerName);
//CCrack::ShowErrorMessage(szMsg, dwR);
return E_FAIL;
}
hr = CLSIDFromString( clsidString, &clsid );
if( FAILED(hr))
{
//szMsg.Format(_T("CLSIDFromString for %s : \n"), szServerName);
//CCrack::ShowErrorMessage(szMsg, hr);
return E_FAIL;
}
if(szNodeName.IsEmpty() == TRUE) // no node name, use local
{
hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IOPCServer, (LPVOID *)&gpIOPCServer);
if( FAILED(hr) || gpIOPCServer == NULL)
{
//szMsg.Format(_T("CoCreateInstance for %s : \n"), szServerName);
//CCrack::ShowErrorMessage(szMsg, hr);
gpIOPCServer = NULL;
return hr;
}
}
else
{
// COSERVERINFO si;
//MULTI_QI qi;
Caution COSERVERINFO struct is different in VC++ 4.0 and VC++ 5.0
#if(_MSC_VER < 1100)
si.dwSize = sizeof(COSERVERINFO);
si.pszName = CCrack::wszFromCString(szNodeName);
#else
si.pAuthInfo = NULL;
si.pwszName = CCrack::wszFromCString(szNodeName);
si.dwReserved1 = 0;
si.dwReserved2 = 0;
#endif
qi.pIID = &IID_IOPCServer;
qi.pItf = NULL;
qi.hr = 0;
hr = CoCreateInstanceEx(clsid, NULL, CLSCTX_SERVER, &si, 1, &qi);
if (FAILED(hr))
{
szMsg.Format(_T("CoCreateInstanceEx for %s : \n"),
szServerName);
CCrack::ShowErrorMessage(szMsg, hr);
return hr;
}
if (FAILED(qi.hr))
{
szMsg.Format(_T("Failed to connect to server %s : \n"),
szServerName);
CCrack::ShowErrorMessage(szMsg, hr);
return qi.hr;
}
gpIOPCServer = (IOPCServer*) qi.pItf;
}
if(hr!=S_OK)
{
szMsg.Format(_T("QueryAvailableProperties for %s : \n"),
szServerName);
CCrack::ShowErrorMessage(szMsg, hr);
return hr;
}
// m_szServerName = szServerName;
//m_szNodeName = szNodeName;
//m_dwClsContext = dwClsContext;
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -