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

📄 opcclient.cpp

📁 DCOM 上位机和嵌入式系统通信
💻 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 + -